谈谈正则表达式

最近京东图书在搞活动,就兴起买了几本书,包括余晟老师的《正则指引》,Unix经典书籍《Linux/Unix设计思想》等。我没有看过对《正则指引》这本书的评价,而是因为几个月前无意间在InfoQ上看到余晟老师发表的一篇文章《Linux/Unix工具与正则表达式的POSIX规范》,觉得总结概括的非常好,也解了我平时不少的疑惑,我也向几位朋友推荐过这篇文章。

有些人可能对正则表达式嗤之以鼻,认为它不易维护,晦涩难懂。事实上,他们会有这样的想法是因为对正则不了解(或者其它)。我一直坚信存在就是合理的,正则表达式的出现,并且在众多编程语言和许多工具中都得到支持,必然有它独具魅力的一面。假设你想检查一个邮箱地址是否合法,如果不用正则表达式,请问你会用什么来处理呢?自己编写一段复杂的字符串匹配的代码吗?若已用好的工具,何必再推倒重头再来,站在巨人的肩膀上,可以走得更远。

正则表达式是处理文本和字符串的利器,不过武器虽锋利,但是还是需要人用得好。我觉得正则表达式的长度不应该过长,短小则精悍,用《Linux/Unix设计思想》中的一条原则来说,则是“小即是美”。过长的正则表达式才真得会让人晦涩难懂,我估计即使写出这些正则表达式的人过段时间后也不见得能够解释清楚。例如针对URL地址的匹配,可以在网上找到很多人给出的正则表达式。其中,有些为了严格遵循标准定义的URL规范,给出的正则往往如天书般。我记得曾经看到过一个更加长的表达式,不过忘记地址了。相信看到这种表达式,大家都没有复制的兴趣了吧,有时候必须在功能和性能(或者可用性,可维护性)之间做出选择的。

回头继续说正则表达式,我一直对脚本编程非常感兴趣,而脚本语言往往对正则的支持比较好,例如Perl、Python等。因此,很早就接触了正则表达式。而今,因为工作的需要(运维),往往有更多机会用到正则表达式,这样可以节省我非常多的时间,并且得到的效果也是很好的。正则表达式发展到现在,事实上流派已经很多了。不同的语言不同的工具对正则的支持实现都不一样。我所接触过的,JavaScript中的正则相对比较弱,Python中的正则已经比较完善了,而像Linux下面的一些工具,例如sed、grep、vim等,它们所提供的正则一般和编程语言中的不大一样,即使工具之间也会有很多区别。

继续阅读