\(((?<Open>\()|(?<-Open>\))|.)*?(?(Open)(?!))\)
\(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)
匹配:a+(b+c))+(d+e)
结果都是:
(a+(b+c))
(d+e)
但是匹配:((a+(b+c))+(d+e)
结果不同,这两种写法应该都可以呀!为什么不同呢?

解决方案 »

  1.   

    \(((?<Open>\()|(?<-Open>\))|.)*?(?(Open)(?!))\)
    也可以换成这样
    Regex reg = new Regex(@"\(((?<Open>\()|(?<-Open>\))|(?:(?!(?:\(|\))).)*)*?(?(Open)(?!))\)");
    不过对于匹配固定的话直接用[^...]来匹配
    至于解释你看看过客大婶的博客,里面讲解很清楚了
    http://blog.csdn.net/lxcnn/article/details/4402808
      

  2.   

    这两种方法,其实如果对于嵌套是对称的字符串来测试的话,结果是一样的。。
    但是如果嵌套不对称,比如楼主那个例子,((a+(b+c))+(d+e),这里右括号"("多一个。。
    初次匹配的过程中,"("总比")"多,所以直到字符串结束的时候,两个正则都是匹配失败的,于是开始回溯。。\(((?<Open>\()|(?<-Open>\))|.)*?(?(Open)(?!))\)
    对于这个正则,因为"."是包括"("的,所以在进行回溯的时候,分支结构的匹配作了调整,也就是用"."去匹配这个右括号,((a+(b+c))+(d+e),所以这个右括号就不会被计数,被当作普通字符处理,这样的话嵌套就是对称的,所得的结果就是 ((a+(b+c))+(d+e)。。\(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)
    但是用这个正则的话就不会出现这种情况,因为用了排除型字符组,分支结构中的集合都是互斥的,所以分支结构中的匹配不会发生变化,所以第一次回溯的整个过程都不会成功,因为"("永远比")"多。。
    所以正则的匹配就从第二个字符开始,也就是 ((a+(b+c))+(d+e)。。
    这样的话结果就显而易见了,是 (a+(b+c)) 和 (d+e)。。所以严格来说俩正则不完全一样,只能说在原字符串嵌套对称的时候结果是一样的。。