regex 匹配大括号内内容的正则表达式

ee7vknir  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(194)

我试图使一个正则表达式提取任何字(字母数字)之间的花括号,如下面的例子:
{{name}}您好,您的全名是{{连续名字****姓氏}}
条件为:
1.如果里面的内容只包含一个连续的alpha_numeric,这意味着它是一个变量,应该被提取。
1.如果里面的内容包含多个由空格分隔的alpha_numeric,这意味着第一个出现的是函数名,应该被忽略,但是应该提取其余的参数(函数参数)。
1.每个函数参数用空格分隔。
1.每个变量名可以包含多个单词,但变量名中的每个单词应使用分隔符连接,例如:名字
1.函数参数可以有一个或多个参数,并且每个参数都应该匹配。
因此,第一个示例的结果应为:
姓名、名字、姓氏。
这就是我所尝试的:\{\s*\{\s*([^\}\/\s]+)\s*\}\s*\}
但它只涵盖了第一种情况。
再举一个例子:

"Key": "price_change_manager.msg2 {{ message }}"
value": "{{  username }} plan to {{formatCurrence new_price currency old_price }}"

应符合:消息、用户名、新价格、货币、旧价格。

uurv41yg

uurv41yg1#

一个不是特别复杂的带有一些if的正则表达式确实可以工作,例如:

re := regexp.MustCompile(`\{\{ *([a-zA-Z_]+|[a-zA-Z_]+(( +[a-zA-Z_]+)+)) *\}\}`)
matches := re.FindAllStringSubmatch("{{  username }} plan to {{formatCurrence new_price currency old_price }}", -1)

这将产生如下所示的切片:

[["{{  username }}" "username" "" ""] ["{{formatCurrence new_price currency old_price }}" "formatCurrence new_price currency old_price" " new_price currency old_price" " old_price"]]

所以你可以这样处理它:

findings := []string{}
  for _, m := range matches {
    if m[2] == "" {
      // When the 3rd element is empty then it's a single match, in the 2nd element
      findings = append(findings, m[1])
    } else {
      // Otherwise it's multi match, in one string in the 3rd element
      // Split it and then append them
      findings = append(findings, strings.Split(strings.Trim(m[2], " "), " ")...)
    }
  }
  // Your result is in findings

相关问题