计算的世界大概都是由规则构成的。从最简单的二进制运算,到复杂的格式化文本,以及
构建互联网络的各种协议,整个行业都在几十年如一日的定制、复制和客制化各种规则。
在一切变得越来越复杂的时候,我们终于为“分析这些原本很有规则的数据”发了愁。因
为规则多到一定程度的时候,也就湮没了规则本身。
从一系列的数据中找到规则并描述这些规则的工具,是“正则表达式”——在早期,它确
实就被译作“规则表达式”。更加重要的是,现今的各种语言内置了强大的正则表达式支
持,使得这些“规则”可以被复用、编程,以及用于推理。当然,前提是你需要理解“规
则表达式”自身的规则——那种象天书一样的符号集合。
JavaScript之父曾经创建了一个项目,用一个(内嵌于JS引擎的)规则表达式的子集,实现
了一套JavaScript的语法分析、执行的引擎:“在JS中实现的JS(JS implemented in JS)”。
以分析150k代码为例,这个引擎大概需要8分钟。然而经过对正则表达式的优化,这可以降
到8秒以下。我想,如果Brendan Eich也会用错正则表达式的话,大概没有太多的人能说自
己精通正则表达式了。
在这些不太多的人中,应该包括《精通正则表达式》的作者:Jeffrey E.F.Friedl。当我
看到这本《精通正则表达式》时,我确信了我的这一观点。
仔细地阅读这本大部头的书。我想,对于一个有一定经验的读者,这本书最大的价值在于:
-让你有机会了解各种正则表达式的流派、起源与差异;
-让你知道如何有效的优化和评估正则表达式性能;
-让你精通正则表达式的各种细节和陷井。
事实上,作为语言的使用者,上述这些正是通向精深至境的必由之路。语言之泛化源于种
种环境的影响,却又宥于创生时的本质设定。有机会了解这些源初的设定,对于使用者来
说,当是受益匪浅。而性能、细节与陷井,则是工程中排错调优的法宝,若有《精通正则
表达式》这样的手册在侧,确是省了很多很多的功夫。
对于作者来说,这本《精通正则表达式》最艰难之处大概是在内容的组织上。不管是初学
者还是老手,都很难在正则表达式中找到一个好的学习起点。所幸的事,Jeffrey的确找到
了这样的一个起点。本书的第一、二章会让读者在正则表达式的全然无序中找到一点点清晰
印象。
《精通正则表达式》一书的写法也是我非常之欣赏的。一直以来,向一个不懂或不太了解
正则表达式的开发人员介绍正则表达式的原理,被认为是一项不可能完成的任务。然而在
这本书中,作者使用了非常直观的图例,以至分析正则表达式时的一套完整的描述方法。
所有复杂莫名的(例如perl中用来做嵌套的动态表达式)代码都被解释得一清二楚。
另一方面,余晟的翻译也让我颇有好感。个人之见,读译作最麻烦之处在于一些名词上的
不同翻译法,例如Interface何处译作“接口”与“界面”,便是一大难。很多译者在这样
的问题上备受责难。侯捷先生以前的做法是在书稿前先说明,书稿后附一份对译表,以至
于后来对译表成了一种标准的“侯氏译法”。另一些译者则选用比较便捷的方式,在通用
的译法后面加注英文单词。余晟先生就采用了这样的译法,例如:“一系列字母和数字符
号(alpha numeric characters)”。如果不采用这样的译法,我想中译版难有如此通顺。
读书的时候,想起来朋友leeon。他总喜欢把书捧进厕所,以至于连《程序语言设计-实践
之路》这样的大部头也被他归于“厕所书”之列。我一直以来想告诫他这是一种对生理和心
理都不太好的习惯,但终于没这样做。因为对于一个顽固分子来说,改变他的习惯的唯一方
式,是让他的习惯受到阻碍,而不是某种形式的箴言。
好了,今天终于可以向他推荐这本《精通正则表达式》了。这是我唯一深信leeon不可能用
很长的时间在马桶上阅读的书。因为复杂的正则会写得如同天书一般,而本书中那些浅显明
了的解释,一定会让leeon有一种扼止不住的冲动,以至于要从马桶上弹射到计算机面前去写
段代码来做做测试。
当然,在弹射之前leeon还有一些手续性的工作要做。只是,我想,那根本不是这本书的作
者所要考虑的问题。^.^
又:
-----
不过,我并不满意Jeffrey用Egrep来作为正则初学者的示例。我甚至认为拿Windows平台的
DOS命令行中的那个名为FindStr的小工具来做示例都不错。
Jeffrey显然不是微软的fans,对正则表达式支持最好的perl语言也并不那么特别的亲近微
软的平台。因此Jeffrey没有看到FindStr这样不起眼的小工具,大概也不是什么问题。只
是对于读者来说,要找到一个名为Egrep的工具来做前两章的实验,可不是一件容易的事情。
回到初学者的话题,我仍然建议初学者拿一个惯用的工具来做基本的测试。我分析源代码时
习惯于使用grep(Turbo Grep, 随borland产品发布),这是一个不错的推荐,对于读者来说,
用FindStr也不错。当然如果你所使用的语言支持正则表达式,并且你已经有一定的实用经
验,那么这些建议你权当我没说。
FindStr的基本使用:
----
FindStr /R "<一个正则表达式>" *.txt
grep的基本使用:
----
grep -r+ "<一个正则表达式>" *.txt
分享到:
相关推荐
《正则表达式之道》一书由Steve Mansour撰写,Neo Lee翻译,内容涵盖了正则表达式的各个方面,适合初学者及有一定经验的开发者阅读。 #### 二、正则表达式示例 书中提供了不同难度级别的正则表达式示例,帮助读者...
根据提供的文件信息,“正则表达式之道 Steve”这篇文章由Steve Mansoursman撰写,并由Neo Lee进行翻译。尽管没有提供文章的具体内容,但基于标题、描述和部分标签信息,我们可以合理推测该文章主要围绕正则表达式的...
常用的正则表达式require-lee.js
Java正则表达式提取双引号中间的部分方法 Java正则表达式是Java语言中的一种模式匹配技术,用于字符串的搜索、验证和提取。今天,我们将分享Java正则表达式提取双引号中间的部分方法,这种方法可以应用于各种字符串...
本书从正则表达式的基本概念、基本语法入手,着重于数字验证、字符串验证、数字和字符串混合验证及HTML处理等各个方面的应用。并基于目前流行的程序语言和应用环境(如C#、ASP.NET、JSP、JavaScript或PHP),全面...
原著:Steve Mansour sman@scruznet.com <br>Revised: June 5, 1999 (copied by jm /at/ jmason.org from ... ) <br>翻译:Neo Lee neo.lee@gmail.com<br>2004年10月16日 <br>
### Java 文件 I/O 与正则表达式 #### 一、Java 文件 I/O 系统概览 在《Java 编程第十三讲 IO 系统》这份文档中,作者 Harry Lee 对 Java 的输入输出(I/O)系统进行了全面而深入的讲解。Java I/O 系统是 Java ...
4. 使用正则表达式来定义复杂的验证规则,了解基本的正则表达式语法和常见模式。 在"CustomValidationLibrary"压缩包中,你应该能找到这些自定义验证控件的源代码和示例项目。通过研究这些代码,你可以学习到如何...
总的来说,这个电子邮件地址搜集器利用了网络编程(Winsock)、正则表达式匹配(自动机)和可能的编译技术。它能够从网页内容中提取电子邮件地址,对于需要批量处理邮件列表或者网络营销的用户来说,具有一定的实用...
- **命名来源**: grep 的名称源自 ex 编辑器中的命令 g/RE/p,意为全局搜索并打印匹配正则表达式 RE 的行。 - **开发者**: Ken Thompson 在 1973 年编写了 grep。 - **首次出现**: grep 最早出现在 Unix v4 版本中。...
这里的“pcre”代表“Perl Compatible Regular Expressions”,这是一个开源库,提供了支持Perl语法的正则表达式功能。这个版本8.21指的是该库的一个特定发行版。 在描述中提到的“安装lamp环境必备”,意味着pcre-...
第8章 字符串和正则表达式 第9章 泛型 第10章 线程化 第11章 文件和流 第12章 异常处理 第13章 数组和集合 第14章 语言集成查询(LINQ) 第15章 程序集和版本化 第Ⅱ部分 使用C#开发应用程序 第16章 开发Windows应用...
第8章 字符串和正则表达式 第9章 泛型 第10章 线程化 第11章 文件和流 第12章 异常处理 第13章 数组和集合 第14章 语言集成查询(LINQ) 第15章 程序集和版本化 第Ⅱ部分 使用C#开发应用程序 第16章 开发Windows应用...