正则表达式:用数学表达式中的参数捕获函数

时间:2021-06-01 10:09:48

标签: regex

我观察匹配的字符串如下:

5 + __FXN1__('hello', 1, 3, '__HELLO__(hello) + 5') + 5 + (2/2) + __FXN2__('Good boy')

我尝试使用匹配的正则表达式 [A-Z0-9_]+\(.*?\)

__FXN1__('hello', 1, 3, '__HELLO__(hello)__FXN2__('Good boy')

我期待的是:

__FXN1__('hello', 1, 3, '__HELLO__(hello) + 5')__FXN2__('Good boy')

我们怎样才能实现它。请帮忙。

1 个答案:

答案 0 :(得分:0)

如果括号总是平衡的,你可以使用基于递归的正则表达式

__[A-Z0-9_]+__(\((?:[^()]++|(?-1))*\))

如果字符串中的 () 数量不平衡,可能会失败,请参阅 this regex demo。简而言之:

  • __[A-Z0-9_]+__ - __,一个或多个大写字母、数字或 _,然后是 __
  • (\((?:[^()]++|(?-1))*\)) - 第 1 组:(,然后出现任何零次或多次出现的一个或多个字符,而不是 () 或整个第 1 组模式递归,然后是一个 )(因此 (...) 子字符串与任意数量的成对嵌套括号匹配)。

如果你需要支持不平衡括号,使用只匹配所有允许的数据格式的正则表达式更安全,例如

__[A-Z0-9_]+__\(\s*(?:'[^']*'|\d+)(?:\s*,\s*(?:'[^']*'|\d+))*\s*\)

参见regex demo。或者,如果 ' 可以在 \ 字符串中使用 '...' 字符进行转义,您可以使用

__[A-Z0-9_]+__\(\s*(?:'[^'\\]*(?:\\.[^'\\]*)*'|\d+)(?:\s*,\s*(?:'[^'\\]*(?:\\.[^'\\]*)*'|\d+))*\s*\)

this regex demo

详情

  • __[A-Z0-9_]+__ - __,一个或多个大写或数字,然后是 __
  • \( - ( 字符
  • \s* - 零个或多个空格
  • (?:'[^']*'|\d+) - ',零个或多个非',然后是一个 ' 或一个或多个数字
  • (?:\s*,\s*(?:'[^']*'|\d+))* - 零次或多次出现的 , 用可选空格括起来,然后是 '...' 子字符串或一个或多个数字
  • \s*\) - 零个或多个空格,然后是 )

请注意,如果您需要支持任何类型的数字,则需要将 \d+ 替换为更复杂的模式,例如 [+-]?\d+(?:\.\d+)?more

相关问题