\(((?<Open>\()|(?<-Open>\))|.)*?(?(Open)(?!))\)
\(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)
匹配:a+(b+c))+(d+e)
结果都是:
(a+(b+c))
(d+e)
但是匹配:((a+(b+c))+(d+e)
结果不同,这两种写法应该都可以呀!为什么不同呢?
\(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)
匹配:a+(b+c))+(d+e)
结果都是:
(a+(b+c))
(d+e)
但是匹配:((a+(b+c))+(d+e)
结果不同,这两种写法应该都可以呀!为什么不同呢?
解决方案 »
- 想找一个开源代码的网站
- asp.net中label问题
- datagridview控件中的DataGridViewComboBoxColumn使用时如何获取到下拉选项的SelectedIndex值
- 如何递归加添TreeView节点
- 求URL验证的正则表达式
- 希望高手帮我看看,help!
- C# DataColumm
- wpf combobox 多选
- 问一个低级的问题!得到的时间应该保存到什么变量中去!时间戳??
- 请教插入Access表的一个记录的操作。
- 做一个算法, 能够将一个浮点数转换成整数. (不得使用.net中现成的算法, 或各数据类型的Parse方法)
- 读取CSV文件,记录成功和失败的数据ID和原因。
也可以换成这样
Regex reg = new Regex(@"\(((?<Open>\()|(?<-Open>\))|(?:(?!(?:\(|\))).)*)*?(?(Open)(?!))\)");
不过对于匹配固定的话直接用[^...]来匹配
至于解释你看看过客大婶的博客,里面讲解很清楚了
http://blog.csdn.net/lxcnn/article/details/4402808
但是如果嵌套不对称,比如楼主那个例子,((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)。。所以严格来说俩正则不完全一样,只能说在原字符串嵌套对称的时候结果是一样的。。