当前位置: 代码迷 >> Web前端 >> 读《正则表达式30分钟入门教程》随想
  详细解决方案

读《正则表达式30分钟入门教程》随想

热度:122   发布时间:2013-03-04 17:22:12.0
读《正则表达式30分钟入门教程》有感

《正则表达式30分钟入门教程》 是一篇非常精彩的正则表达式入门介绍的文章,文章部分翻译自《The 30 Minute Regex Tutorial》。很早之前我就曾拜读过,印象很深刻。今天再次拜读,是想温故一下正则表达式的知识。这次读得比较细致,对正则表达式又有了更深刻的认识,现分享如下:

?

1. ?“分枝条件”一节中,作者说\(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8}可以 “匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔”。但其实这个表达式,依然可以匹配“010)12345678”这样的case。正确的表达式应该是:\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}应该是作者的笔误。

?

?

2. ?“后向引用”一节中,作者对(?:exp)的使用原因卖了一个关子,我个人理解是,使用这个是为了performance的原因,如果你对这个分组并不感兴趣,没有必要去捕获它,捕获它势必会消耗一定的时间与空间。

?

3. ?“零宽断言”一节中,作者提到:“((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890” , 个人觉得这个例子举得不好,因为(\d{3})+\b同样能达到目的,这里体现不出断言的作用。我想到了一个好玩的例子:用 ab(?=cd)ef 去匹配abcdef 会怎么样呢?

?

4. ?“负向零宽断言”一节,我本来一直觉得“负向零宽断言”完全可以由“零宽断言”替代,比如\b\w*q(?!u)\w*\b?与?\b\w*q(?=[^u])\w*\b是等价的。但其实不然,我们并不能表达任何正则表达式的反向意思,比如[abcd]的反向意思是[^abcd],但abcd的反向意思是什么呢??\b((?!abc)\w)+\b 就没法用"零宽断言"来取代。

?

5. ?“平衡组/递归匹配”一节,压栈操作与出栈操作的语法与命名组的语法是一样的,是不是说,每个有名字的组都会被压栈,且组名不能以减号开始,以免与出栈操作混淆?(不懂.Net ,所以没法验证:P)

?

6. ?最后,我想说看这样一篇文章,如果用心看并且边看边实践的话确实不止30分钟。在此推荐一个很好的网站:http://regex101.com/ 可以很方便地测试正则表达式(并且它支持Possessive数量修饰符"+")。

?

?

?

?

?

1 楼 kidneyball 2013-02-26  
(?:)的使用原因除了避免浪费空间,还避免了产生过多的子分组导致难以判断哪个子组中包含真正想要的信息。

学习正则,如果使用windows的话建议装个regexbuddy ( http://www.regexbuddy.com/ )
2 楼 leonzhx 2013-02-26  
kidneyball 写道
(?:)的使用原因除了避免浪费空间,还避免了产生过多的子分组导致难以判断哪个子组中包含真正想要的信息。

学习正则,如果使用windows的话建议装个regexbuddy ( http://www.regexbuddy.com/ )


谢谢 :)