返璞归真——评《正则指引》
第一次接触正则表达式,是2000年我在西安一家公司使用Perl做网站开发时。之前我在工作中只使用过标准的C语言,Perl这门编程语言的强大表达能力,令我印象极为深刻。Perl的力量,除了语言本身的设计之外,很大程度上来自于它对正则表达式的完美支持。当时我们开发了一个网上商城的应用,允许很多商家在这里开店,可以选择一些不同的样式模板。我很快发现,使用Perl+正则表达式是开发这类应用的利器。我们只花了大约一个月的时间,就完成了网站核心功能的开发。那时候我意识到,使用正则表达式是聪明人写程序的方法(没说我是聪明人,但是我非常希望与那些聪明人为伍),可以极大地提高代码的重用度和执行效率。如果完全不使用正则表达式,代码量会增加数倍甚至十倍。
后来因为一些原因,我告别了Perl。在之后的工作中,我使用过Java、JavaScript、Ruby等编程语言。我发现这些语言对于正则表达式的支持,没有一个能够超越Perl。Java这种所谓的“工业主流编程语言”,一直到2002年JDK 1.4推出时,才正式把对正则表达式的支持加入到核心类库。因为长期缺乏对正则表达式的原生支持,以及语言本身表达能力欠缺,使用Java来做大量的文本处理,感觉非常笨拙,完全没有使用Perl那种指哪打哪的快感。直到2007年我发现了另一个更好的Perl语言——Ruby,才重新找回了2000年Perl带给我的编程快感。
因为我的工作主要是做Web开发,大量的时间花在与HTML/CSS/JavaScript以及关系数据库打交道上。在这里并没有很高深的算法,只有大量繁重的文本处理。难以想象,如果没有正则表达式,我们的开发将会是何等原始。
除了Web开发领域,需要实现大量自动化功能的一些领域,例如运维领域和自动化测试领域,也是正则表达式大显身手的地方。无论使用稍显简陋的sed/awk还是更高级的Perl/Python/Ruby,实现自动化功能,都必须依赖大量的正则表达式。
自从面向对象时髦起来之后,甚至一度出现了面向对象万能论,有人试图用MDA和可执行的UML来解决一切编程问题。但是我一直认为面向对象只解决了软件开发的一小部分问题,而且是宏观方面的问题。正则表达式解决的问题,是面向对象无能为力的一些微观方面的问题。在这里不需要坐而论道的方法论争论,需要的是刺刀见红的肉搏战。这些问题即使使用完全面向对象的方式能够解决,也会是很笨拙的。如果用物理学来比喻,面向对象是“广义相对论”,而正则表达式则是“量子力学”。
正则表达式已经成为了现代编程语言的基础模块,现在很难找到一种不支持正则表达式的编程语言。除了编程语言外,在很多工具软件,例如文本编辑器(Vi、Emacs、UltraEdit)、Web服务器(Apache、Nginx)之中都能找到正则表达式的身影。
余晟老师是我的朋友,我对他印象最为深刻的是他对于技术工作的严谨态度。“格物致知”是中国传统儒家学派所追求的一种道德修养,也是一种境界。余老师是我的朋友中最接近“格物致知”这种境界的一位。我虽然从未精通过任何一门技术,但是很喜欢结交余老师这样的朋友。
余老师潜心编著的这本《正则指引》深入浅出,将正则表达式的由来和分支娓娓道来。阅读这本书,我仿佛回到了11年前做Perl程序员时的快乐时光。国内很多程序员的一个通病是好高骛远,像《正则指引》这样一本详细讲解基础知识的书未必会有很好的销路。但是等你做过很多年开发之后,你会发现,对你最有价值的,正是这些基础知识和工具。软件开发的“道”,正是隐藏在这些看起来不起眼的基础知识和工具之中的。
李锟
2011年11月25日