本书通过示例介绍如何编写正则表达式,旨在让读者轻松掌握正则表达式。事实上, 笔者几乎将所涉及的每一个概念都通过示例展示了出来,读者很容易模仿尝试。 正则表达式有助于找到文本字符串中的各种模式。更确切地说,正则表达式是经过专门编写的文本字符串,用来匹配字符串(尤其是文件内字符串)集合中符合该模式的所有字符串。 正则表达式最早出现于美国数学家斯蒂芬 ·克莱尼编写的Introduction to Metamathematics 一书中(1952 年Van Nostrand 公司出版)。但其实这个概念早在20 世纪40 年代初就已形成。到了70 年代,随着Unix 操作系统及其实用程序sed、grep 等问世,正则表达式得到了计算机科学家更为广泛的使用。Unix 操作系统是美国电话电报公司下属贝尔实验室的Brian Kernighan、Dennis Ritchie、Ken Thompson 以及其他工作人员的杰作。 据我所知,最早出现正则表达式的计算机应用程序是QED 编辑器。QED 是Quick Editor 的缩写, 它是为运行在Scientific Data Systems 公司1 SDS 940 计算机中的Berkeley Timesharing System 编写的。1970 年的记录显示,QED 是由Ken Thompson 在之前MIT 的Compatible Time-Sharing System 中另外一个编辑器基础上重写而成的。从此,计算技术领域有了真正的正则表达式实现。(附录中的表A-1 列出了QED 的正则表达式特性。) 注1: Scientific Data Systems(英文缩写SDS),是Max Palevsky 于1961 年在美国成立的一家计算机公司, 也是最早在计算机设计中使用集成电路和硅晶体管的公司。SDS 计算机主要针对大型科学计算,物美价廉。“太空竞赛”期间NASA 曾购买了很多台SDS 计算机。SDS 在1969 年被施乐(Xerox)公司收购, 1975 年由于管理不善和销售下滑被关闭。在施乐管理期间,该公司一度被称为XDS。——编者注 本书中用来展示示例的工具很多,但多数都容易获取,而且也很实用。只有少数工具目前还没有好用的Windows 版本。如果你觉得哪个工具不好用,完全可以不用。但要真正学习正则表达式,我还是建议在Unix 环境中学习。我使用Unix 环境长达25 年,每天仍然能够学到不少新东西。 “不懂Unix的人注定还要重新发明一个蹩脚的Unix。” ——Henry Spencer 2 部分工具可以通过浏览器在线使用,这对于许多读者是十分方便的。其余的工具需要使用命令行和shell 脚本,还有一些工具是在桌面上运行的。如果你手头没有这些工具,从网上下载也很方便。其中大多数工具是免费的,偶尔有需要付费的也不贵。 本书中不会出现很多专业术语。我会在必要的时候告诉你正确的术语,但这种情况很少。因为多年的经验表明,专业术语常会造成障碍。换句话说,我会尽可能用通俗易懂的语言描述正则表达式,以免你晕头转向不知所措。因为本书的理念是“略知大概,即可实践”。 正则表达式的实现多种多样。你会发现在vi(vim)、grep 及sed 等Unix 命令行工具中使用的正则表达式也可以在其他程序中见到。各种程序设计语言都支持正则表达式,比如Perl(当然啦3)、Java、JavaScript、C#、Ruby 等。就连XSLT 2.0 这样的声明式语言中也有正则表达式。你还会发现Notepad++、Oxygen 及TextMate 等应用程序同样支持正则表达式。 大多数正则表达式实现各有异同。本书不会逐一讨论它们的差异,但也会涉及一些。如果要我把所有实现的全部不同点都列出来,恐怕非得把我累吐了血不行。所以我在本书中就不纠缠这些细节了。总而言之,如果你期待一本正则表达式的入门书, 那就选这本吧。 注2: Henry Spencer 是加拿大程序员,著名正则表达式库regex 的作者。这个正则表达式库被许多程序包或编程语言采用,比如Perl、Tcl 和MySQL,等等。在多伦多大学工作期间,Henry Spencer 从1981 年开始运作美国之外的第一个Usernet 站点。这个站点后来被谷歌收购,作为20 世纪80 年代Usernet 的公开档案。另外,他还写过“10 Commandments for C Programmers”(C 程序员十诫,http://www. seebs.net/c/10com.html)。——编者注 注3: Perl,后来被人们解释为Practical Extraction and Reporting Language 的缩写。由这个非官方的“全称”—— 实用提取和报告语言——可知,Perl 在处理文本文件和生成报表方面是非常强大的。1987 年,Larry Wall 在美国宾夕法尼亚州蓝铃(Blue Bell)地区的Unisys 公司当程序员的时候发明了Perl。在该语言后来的发展中,正则表达式功能得到不断丰富和加强,最终成为Perl 独树一帜的招牌特色。 ——编者注 目标读者 本书适合从零开始学习正则表达式的读者。如果你准备开始学习正则表达式或编写程序,本书就是很好的起点。换句话说,所有听说过正则表达式且对其非常感兴趣, 但还没有真正理解正则表达式的人,都是这本书的目标读者。如果你属于这种情况, 本书很适合你。 我将采取由简到繁的顺序来介绍正则表达式的特性,也就是先从简单的开始。 如果你已经对正则表达式及其用法有所了解,或者已是位编程老手,本书可能不适合你。本书面向需要指导的初学者。如果你写过一些正则表达式,但希望加深对基本概念的理解,也可以阅读本书,只是我们的节奏可能比你想像的要慢一些。 我在此推荐几本学习完本书后应该阅读的书。第一本是Jeff Friedl 的Mastering Regular Expressions, Third Edition(参见 http://shop.oreilly.com/product/9781565922570.do)。这本书对正则表达式进行了全面阐述,强烈推荐读者阅读。Jan Goyvaerts 和 Steven Levithan 执笔的Regular Expressions Cookbook(参见 http://shop.oreilly.com/product/9780596520694.do) 也是一本相当不错的书4。Jan Goyvaerts 开发的RegexBuddy 是一个强大的桌面应用(参见 http://www.regexbuddy.com),而Steven Levithan 开发了我们第1 章就会用到的在线正则表达式处理程序RegexPal(参见 http://www.regexpal.com)。 阅读要求 为了更好地学习本书,你需要使用Unix 或Linux 操作系统上的一些工具。这些工具在Mac 上的Darwin 系统(BSD 在Mac 上的衍生系统)、Windows 电脑中运行的Cygwin(参见 http://www.cygwin.com 及http://www.gnu.org)中都能找得到。 本书提供了大量示例供你实验,只是看一遍印象不会深刻。要真正掌握正则表达式, 就应该按照这些示例的步骤自己操作,最好把所有示例都过一遍。最好的学习方式是亲身实践,而不是做个旁观者。你得通过本书学会使用高亮显示匹配结果以验证正则表达式的网站、强大的Unix 命令行工具、分析正则表达式或用正则表达式搜索文本的桌面程序。 Github 上托管着本书的示例代码( https://github.com/michaeljamesfitzgerald/Introducing- Regular-Expressions)。另外,通过http://examples.oreilly.com/0636920012337/examples.zip 注4: 这两本书的中文版分别是《精通正则表达式(第3 版)》(电子工业出版社)和《正则表达式经典实例》(人民邮电出版社)。——编者注 XII | 前言 也可以下载到本书所有的示例和测试文件5。学习本书之前,你最好先在自己的计算机上创建一个新文件夹,并将这些文件保存到该文件夹中。 致谢 首先,请允许我再次向本书的编辑、O’Reilly 出版社的Simon St. Laurent 表达深深的谢意。Simon 耐心认真,没有他就不会有这么出色的书。同时感谢Seara Patterson Coburn 和Roger Zauner,他们的审读意见提升了本书的质量。另外,一如既往感谢我的挚爱Cristi,你就是我raison d’être(《存在的理由》)。 Safari®Books Online Safari Books Online(www.safaribooksonline.com)是应需而变的数字图书馆。它同时以图书和视频的形式出版世界顶级技术和商务作家的专业作品。 Safari Books Online 是技术专家、软件开发人员、Web 设计师、商务人士和创意人士开展调研、解决问题、学习和认证培训的第一手资料。 对于组织团体、政府机构和个人,Safari Books Online 提供各种产品组合和灵活的定价策略。用户可通过一个功能完备的数据库检索系统访问O’Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology 以及其他几十家出版社的上千种图书、培训视频和正式出版之前的书稿。要了解Safari Books Online 的更多信息,我们网上见。 排版约定 本书使用的排版约定如下。 楷体• 表示新的术语。 注5: 读者也可以从图灵社区本书网页(http://www.ituring.com.cn/book/955)随书下载部分下载本书示例代码。——编者注前言 | XIII 等宽字体• 表示程序片段,也用于正文中表示程序中使用的变量、函数名、命令行代码、环境变量、语句和关键词等代码文本。 这个图标代表小窍门、建议或说明。 联系我们 请把对本书的评价和问题发给出版社。 美国: O’Reilly Media, Inc. 1005 Gravenstein Highway North Sebastopol, CA 95472 中国: 北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035) 奥莱利技术咨询(北京)有限公司 O’Reilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是: http://oreil.ly/intro_regex 中文版地址: http://www.oreilly.com.cn/index.php?func=book&isbn=978-7-115-31149-8 对于本书的评论和技术性问题,请发送电子邮件到: bookquestions@oreilly.com 要了解更多O’Reilly 图书、培训课程、会议和新闻的信息,请访问以下网站: http://www.oreilly.com 我们在Facebook 的地址如下: http://facebook.com/oreillyXIV | 前言 请关注我们的Twitter 动态: http://twitter.com/oreillymedia 我们的YouTube 视频地址如下: http://www.youtube.com/oreillymedia 示例代码 本书就是要帮读者解决实际问题的。也许你需要在自己的程序或文档中用到本书中的代码。除非大段大段地使用,否则不必与我们联系取得授权。因此,用本书中的几段代码写成一个程序不用向我们申请许可。但是销售或者分发O’Reilly 图书随附的代码光盘则必须事先获得授权。引用书中的代码来回答问题也无需我们授权。将大段的示例代码整合到你自己的产品文档中则必须经过许可。 使用我们的代码时,希望你能标明它的出处。出处一般要包含书名、作者、出版商和ISBN, 例如“Introducing Regular Expressions by Michael Fitzgerald (O’Reilly). Copyright 2012 Michael Fitzgerald, 978-1-4493-9268-0”。 如果还有其他使用代码的情形需要与我们沟通,可以随时与我们联系:permissions@ oreilly.com。