《正则表达式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数量修饰符"+")。
相关推荐
正则表达式30分钟入门教程(第二版),高清PDf格式
正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串。...这个30分钟入门教程将带你逐步了解并应用这些概念,同时提供的常用表达式可以作为参考,帮助你在实际项目中快速解决相关问题。
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的...
当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白...
尽管入门教程能够在较短时间内提供基础知识,但正则表达式的高级用法往往需要更深入的学习和实践。对于一些复杂的正则表达式编写,例如在文本处理中提取特定数据,可能需要编写者具备较强的逻辑分析能力和经验积累。...
正则表达式30分钟入门教程旨在帮助初学者快速掌握这一强大的工具,使你在短时间内能够熟练应用。 一、正则表达式的基础概念 1. 元字符:正则表达式中的特殊字符,如`.`表示任意字符,`*`表示前面的字符可以出现...