使用.net提供的一些扩展,可以通过使用类似的东西找到括号组:
^(\w+)\(((?>[^()]+|\((?<D>)|\)(?<-D>))*(?(D)(?!)))\)(.*)$
这将匹配以下内容:
Func(innerfunction(arg)).DoSomething()
使用以下组:
我的问题是,我如何匹配逗号,考虑它们是否在括号内?例如,要评估的正则表达式:
Func(innerFunction(arg1, arg2), arg3).DoSomething()
应该屈服:
感谢。
答案 0 :(得分:0)
我想我找到了它。有没有人有反例:
^([^()]*?|.*\((?>[^()]+|\((?<D>)|\)(?<-D>))*(?(D)(?!))\).*?),(.*)$
这将匹配此表达式:
func1(arg2, func3(arg3, arg4)), func2(arg5, arg6).property
为:
此解决方案仅查找一个逗号,但它处理任意深度的括号。
更新: Gumbo提供了一个反例:
func1((arg1), arg2), func2(arg3).property
分享到:
HOWEVER :通过将第一个“任何匹配”变为非贪婪,可以解决它:
^([^()]*?|.*?\((?>[^()]+|\((?<D>)|\)(?<-D>))*(?(D)(?!))\).*?)\s*,\s*(.+)$
还有其他反例吗?
答案 1 :(得分:0)
虽然这不是不可能,但我建议不要使用正则表达式。
问题在于表达式往往是完全贪婪或完全不贪婪。例如,请输入以下内容:
(一)B,(C,(d)E,)
贪婪的表达会尽可能地匹配。它会在括号内看到所有,因此返回 nothing 。
ungreedy表达式会正确匹配逗号b,但它也会匹配逗号,因为它会将(c,(d,)
视为一个完整的组。
现在,听起来你已经理解了这些问题,并且.Net正则表达式引擎确实有一个功能,可以让你在某种程度上超越它。但结果表达式将是丑陋的,不可维护的,不是非常便携,容易出错。除非你真的知道自己在做什么,否则最好寻找另一种解决方案。
答案 2 :(得分:0)
如果您不想限制嵌套深度,则单独使用正则表达式是不可能的。
所以我建议你构建一个分解嵌套级别的解析器。逐个字符地读取输入字符。当“(
”增加关卡时,当“)
”降低关卡时,当它是“,
”分开时。