我观察匹配的字符串如下:
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')
我们怎样才能实现它。请帮忙。
答案 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*\)
详情:
__[A-Z0-9_]+__
- __
,一个或多个大写或数字,然后是 __
\(
- (
字符\s*
- 零个或多个空格(?:'[^']*'|\d+)
- '
,零个或多个非'
,然后是一个 '
或一个或多个数字(?:\s*,\s*(?:'[^']*'|\d+))*
- 零次或多次出现的 ,
用可选空格括起来,然后是 '...'
子字符串或一个或多个数字\s*\)
- 零个或多个空格,然后是 )
。请注意,如果您需要支持任何类型的数字,则需要将 \d+
替换为更复杂的模式,例如 [+-]?\d+(?:\.\d+)?
或 more。