请教一个正则平衡组问题

liuyilin888 2011-09-13 08:47:28
\(((?<Open>\()|(?<-Open>\))|.)*?(?(Open)(?!))\)
\(((?<Open>\()|(?<-Open>\))|[^()])*(?(Open)(?!))\)
匹配:a+(b+c))+(d+e)
结果都是:
(a+(b+c))
(d+e)
但是匹配:((a+(b+c))+(d+e)
结果不同,这两种写法应该都可以呀!为什么不同呢?
...全文
79 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyilin888 2011-09-14
  • 打赏
  • 举报
回复
谢谢XiXiHaHa_XiXiHaHa,结贴
灬嘻嘻哈哈灬 2011-09-14
  • 打赏
  • 举报
回复
这两种方法,其实如果对于嵌套是对称的字符串来测试的话,结果是一样的。。
但是如果嵌套不对称,比如楼主那个例子,((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)。。

所以严格来说俩正则不完全一样,只能说在原字符串嵌套对称的时候结果是一样的。。
liuyilin888 2011-09-13
  • 打赏
  • 举报
回复
过客的博客已经看了N次了
就是这点怎么也不明白
其实过客的文章中也提到这2中匹配方式,一种属于贪婪模式,另一种非贪婪模式,2者结果应该一样,但是却不一样,郁闷!
huangwenquan123 2011-09-13
  • 打赏
  • 举报
回复
\(((?<Open>\()|(?<-Open>\))|.)*?(?(Open)(?!))\)
也可以换成这样
Regex reg = new Regex(@"\(((?<Open>\()|(?<-Open>\))|(?:(?!(?:\(|\))).)*)*?(?(Open)(?!))\)");
不过对于匹配固定的话直接用[^...]来匹配
至于解释你看看过客大婶的博客,里面讲解很清楚了
http://blog.csdn.net/lxcnn/article/details/4402808
liuyilin888 2011-09-13
  • 打赏
  • 举报
回复
下班前再顶
liuyilin888 2011-09-13
  • 打赏
  • 举报
回复
下班前再顶

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧