社区
C#
帖子详情
请教一个正则平衡组问题
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
打赏
收藏
请教一个正则平衡组问题
\(((?\()|(?\))|.)*?(?(Open)(?!))\) \(((?\()|(?\))|[^()])*(?(Open)(?!))\) 匹配:a+(b+c))+(d+e) 结果都是: (a+(b+c)) (d+e) 但是匹配:((a+(b+c))+(d+e) 结果不同,这两种写法应该都可以呀!为什么不同呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
下班前再顶
正则
表达式30分钟入门教程
如果你没有
正则
表达式的基础,请跟着教程“一步步来”。请不要大概地扫两眼就说看不懂——以这种态度我写成什么样你也看不懂。当我告诉你这是“30分钟入门教程”时,请不要试图在30秒内入门。 事实是,我身边有个...
【vim && neovim】从入门到精通(“四种”模式、常用命令、
正则
表达式、文件属性、插件安装--代码补全、一键格式化、显示目录)
一小时掌握 vim,使用nivim。
精通Perl(第2版)
精通Perl(第2版)(通往Perl大师之路必读经典书籍,体现了一种编程思维,能够帮你解决很多实际的
问题
) 【美】brian d foy(布瑞恩·D·福瓦)著 王兴宇 刘宸宇 译 ISBN 978-7-121-25419-2 2015年3月出版 ...
调参-2(两人观点)
众所周知,很多机器学习的算法工程师每天的工作就是跑数据、调整参数、对比效果,如此“恶性”循环,机器学习算法的参数很多,例如,点击率(CTR)预估中,广泛使用的LR,有学习率、L1
正则
、L2
正则
等参数。...
java面试题
1)抽象:抽象就是忽略
一个
主题中与当前目标无关的那些方面,以便更充分地 注意与当前目标有关的方面。抽象并不打算了解全部
问题
,而只是选择其中的一 部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...
C#
110,538
社区成员
642,577
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章