避免正则表达式平衡组移出括号
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'\)))*)\)
详情
\[?shared3]?
- 一个可选的 [
、shared
和一个可选的 ]
\.
- 一个点
\[?stringsum]? - an optional
[,
stringsum, and an optional
]`
\(
- 一个 (
((?>[^()]+|(?'Open'\()|(?'Close-Open'\)))*)
- 第 1 组:出现一次或多次
[^()]+|
- (
和 )
或 以外的 1+ 个字符
(?'Open'\()|
- 组 "Open":将 (
推入组堆栈
(?'Close-Open'\))
- 组 "Close" 和 "Open":从 Open
组堆栈中弹出 )
并将当前级别子字符串保存到 Close
组
\)
- 一个 )
字符来完成
我正在使用以下正则表达式来匹配引用特定 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'\)))*)\)
详情
\[?shared3]?
- 一个可选的[
、shared
和一个可选的]
\.
- 一个点\[?stringsum]? - an optional
[,
stringsum, and an optional
]`\(
- 一个(
((?>[^()]+|(?'Open'\()|(?'Close-Open'\)))*)
- 第 1 组:出现一次或多次[^()]+|
-(
和)
或 以外的 1+ 个字符
(?'Open'\()|
- 组 "Open":将(
推入组堆栈(?'Close-Open'\))
- 组 "Close" 和 "Open":从Open
组堆栈中弹出)
并将当前级别子字符串保存到Close
组
\)
- 一个)
字符来完成