读《正则表达式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数量修饰符"+")。

相关推荐