避免正则表达式平衡组移出括号

Avoid regex balancing group to move out of parentheses

我正在使用以下正则表达式来匹配引用特定 UDF 的任何数据脚本的内容:

\[?shared3\]?\.\[?stringsum\]?(((?'Open'\()[^()]*)+((?'Close-Open'\))[^()]*)+)*

它匹配任何实例:

Shared3.StringSum(<some contents here>)

使用平衡组,我也在尝试支持以下情况:

Shared3.StringSum(SomeOtherMethod('input') + AnotherMethod('input'))

但是,当输入如下时,我 运行 遇到了麻烦:

Shared3.StringSum(SomeOtherMethod('input') + AnotherMethod('input')) + ThirdMethod('input')

在最后一种情况下,我的正则表达式也匹配 ThirdMethod('input') 部分。

有什么方法可以改变我的正则表达式,以便在 "parentheses count" 为 0 时立即停止匹配?

您可以使用

\[?shared3]?\.\[?stringsum]?\(((?>[^()]+|(?'Open'\()|(?'Close-Open'\)))*)\)

regex demo

详情

  • \[?shared3]? - 一个可选的 [shared 和一个可选的 ]
  • \. - 一个点
  • \[?stringsum]? - an optional[,stringsum, and an optional]`
  • \( - 一个 (
  • ((?>[^()]+|(?'Open'\()|(?'Close-Open'\)))*) - 第 1 组:出现一次或多次
    • [^()]+| - ()
    • 以外的 1+ 个字符
    • (?'Open'\()| - 组 "Open":将 ( 推入组堆栈
    • (?'Close-Open'\)) - 组 "Close" 和 "Open":从 Open 组堆栈中弹出 ) 并将当前级别子字符串保存到 Close
  • \) - 一个 ) 字符来完成