如何在.net正则表达式中找到不在括号内的逗号?

时间:2009-02-27 17:00:10

标签: .net regex

使用.net提供的一些扩展,可以通过使用类似的东西找到括号组:

^(\w+)\(((?>[^()]+|\((?<D>)|\)(?<-D>))*(?(D)(?!)))\)(.*)$

这将匹配以下内容:

Func(innerfunction(arg)).DoSomething()

使用以下组:

  • 第1组:Func
  • 第2组:内部功能(arg)
  • 第3组:.DoSomething()

我的问题是,我如何匹配逗号,考虑它们是否在括号内?例如,要评估的正则表达式:

Func(innerFunction(arg1, arg2), arg3).DoSomething()

应该屈服:

  • 第1组:Func
  • 第2组:innerFunction(arg1,arg2)
  • 第3组:arg3
  • 第4组:.DoSomething()

感谢。

3 个答案:

答案 0 :(得分:0)

我想我找到了它。有没有人有反例:

^([^()]*?|.*\((?>[^()]+|\((?<D>)|\)(?<-D>))*(?(D)(?!))\).*?),(.*)$

这将匹配此表达式:

func1(arg2, func3(arg3, arg4)), func2(arg5, arg6).property

为:

  • Group1:func1(arg2,func3(arg3,arg4))
  • Group2:func2(arg5,arg6).property

此解决方案仅查找一个逗号,但它处理任意深度的括号。

更新: Gumbo提供了一个反例:

func1((arg1), arg2), func2(arg3).property

分享到:

  • Group1:func1((arg1)
  • Group2:arg2),func2(arg3).property

HOWEVER :通过将第一个“任何匹配”变为非贪婪,可以解决它:

^([^()]*?|.*?\((?>[^()]+|\((?<D>)|\)(?<-D>))*(?(D)(?!))\).*?)\s*,\s*(.+)$

还有其他反例吗?

答案 1 :(得分:0)

虽然这不是不可能,但我建议不要使用正则表达式。

问题在于表达式往往是完全贪婪或完全不贪婪。例如,请输入以下内容:

  

(一)B,(C,(d)E,)

贪婪的表达会尽可能地匹配。它会在括号内看到所有,因此返回 nothing

ungreedy表达式会正确匹配逗号b,但它也会匹配逗号,因为它会将(c,(d,)视为一个完整的组。

现在,听起来你已经理解了这些问题,并且.Net正则表达式引擎确实有一个功能,可以让你在某种程度上超越它。但结果表达式将是丑陋的,不可维护的,不是非常便携,容易出错。除非你真的知道自己在做什么,否则最好寻找另一种解决方案。

答案 2 :(得分:0)

如果您不想限制嵌套深度,则单独使用正则表达式是不可能的。

所以我建议你构建一个分解嵌套级别的解析器。逐个字符地读取输入字符。当“(”增加关卡时,当“)”降低关卡时,当它是“,”分开时。