平衡括号问题:匹配函数参数

3
我需要一个PCRE正则表达式来匹配特定的平衡括号情况。虽然我已经查看了许多有关此问题的讨论(例如这里),但我无法使任何东西起作用。我正在尝试使用regex101.com进行调试。
我想要匹配类似于MyFunction(foo)中的foo字符串,其中foo可以是任何内容,包括本身包含括号的其他函数调用。也就是说, 我想能够匹配以下内容:
MyFunction(23)
MyFunction('Sekret')
MyFunction( 23, 'Sekret', Date() )
MyFunction( Encrypt('Sekret'), Date() )

但是MyFunction可能是一个更大字符串的一部分,该字符串本身可以有括号,例如:

logger.info("MyFunction( Encrypt('Sekret'), Date() )")    

如果这样的话,我只想匹配传递给MyFunction的内容,而不是传递给logger.info的内容。

这样做的目的是用别的东西替换传递给MyFunction的任何东西,例如“XXXXXX”。

使用链接问题中的正则表达式(例如\((?:[^)(]+|(?R))*+\))将匹配最外层的圆括号,但如果我尝试在它之前加上MyFunction - 也就是说,如果我尝试使用正则表达式MyFunction\((?:[^)(]+|(?R))*+\) - 它就会失败。

2个回答

3

正则表达式:MyFunction(\((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!))\))

演示

更新的正则表达式,支持PCRE。

MyFunction\((?:[^()]*(?:\([^()]*\))*[^()]*)*\)

演示2

再次更新的正则表达式,支持嵌套函数

MyFunction\(((?:[^()]++|\((?1)\))*)\)

演示3


天啊,我甚至无法开始理解它!不幸的是,虽然它对你的演示有效,但它不是所请求的PCRE正则表达式,因此对我的用例失败了。 - user9219182
不错的方法,但对于嵌套函数调用(例如MyFunction(foo(bar(baz))))将会失败。 - tshiono

3

请您尝试一下:

(?<=MyFunction\()([^()]+|\((?1)*\))+(?=\))

演示

  • (?<=MyFunction\() 是一个正向后瞻断言,用于匹配字符串 MyFunction(,但不包含在捕获组中。
  • ([^()]+|\((?1)*\))[^()]+\((?1)*\)的切换。前者匹配除()之外的字符序列。后者递归匹配括号内的字符串,其中(?1)是捕获组1的部分递归。
  • 最后的(?=\))是一个正向前瞻断言,用于匹配右括号)并与MyFunction(成对出现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接