精通正则表达式-第三版-简体中文版

jovey

贡献于2016-04-18

字数:0 关键词:

MasteringMasteringMasteringMasteringRegularRegularRegularRegularExpressionsExpressionsExpressionsExpressions 精通正则表达式 Jeffrey E.F. Friedl 著著著著 余晟 译译译译 声 明:本书电子稿 由 FLEX 中国 提供 ,仅 作 学习 交 流 ,严禁用于任 何 商 业用 途 。 保 护 眼睛 , 爱 护 视 力 。 如 您 喜 欢 本书 , 请 购 买 正 版图 书。 前言 Preface 本书关注的是一种强大的工具——“正则表达式”。它将教会读者如何使用正则表达式解决 各种问题,以及如何充分使用支持正则表达式的工具和语言。许多关于正则表达式的文档都 没有介绍这种工具的能力,而本书的目的正是让读者“精通”正则表达式。 许多工具都支持正则表达式(文本编辑器、文字处理软件、系统工具、数据库引擎,等等), 不过,要想充分挖掘正则表达式的能力,还是应当将它作为编程语言的一部分。例如 Java、 Jscript、Visual Basic、VBScript、JavaScript、ECMAScript、C、C++、C#、elisp、Perl、Python、Tcl、 Ruby、PHP、sed 和awk。事实上,在一些上述语言编写的过程中,正则表达式扮演了极其 重要的角色。 正则表达式能够充分得到众多语言和工具的支持是有原因的:它们极其有用。从较低的层面 上来说,正则表达式描述的是一串文本(a chunk of text)的特征。读者可以用它来验证用户 输入的数据,或者也可以用它来检索大量的文本。从较高的层面上来说,正式表达式容许用 户掌握他们自己的数据——控制这些数据,让它们为自己服务。掌握正则表达式,就是掌握 自己的数据。 本书的价值 The Need for This Book 本书的第一版写于 1996 年,以满足当时存在的需求。那时还没有关于正则表达式的详尽文 档,所以它的大部分能力还没有被发掘出来。正则表达式文档倒是存在,但是它们都立足于 “低层次视角”。我认为,那种情况就好像是教一些人英文字母,然后就指望他们会说话。 第2版与第 1版间隔了五年半的时间,这期间,互联网迅速流行起来,正则表达式的形式也 有了极大的扩张。这或许并不是巧合。几乎所有工具软件和程序语言支持的正则表达式也变 得更加强大和易于使用。 Perl、Python、Tcl、Java 和Visual Basic 都提供了新的正则支持。 新出现的支持内建正则表达式的语言,例如 PHP、Ruby,C#,也已经发展壮大,流行开来。 在这段时间里,本书的核心——如何真正理解正则表达式,以及如何使用正则表达式——仍 然保持着它的重要性和参考价值。 不过,第1版已经逐渐脱离了时代,必须加以修订,才能适应新的语言和特性,也才能对应 正则表达式在互联网世界中越来越重要的地位。第 2版出版于 2002 年,这一年的里程碑是 java.util.regex、Microsoft .Net Framework 和Perl 5.8 的诞生。第 2版全面覆盖了这些内容。 关于第 2版,我唯一的遗憾就是,它没有提及 PHP。自第 2版诞生以来的 4年里,PHP 的 重要性一直在增加,所以,弥补这一缺憾是非常迫切的。 第3版在前面的章节中增加了 PHP 的相关内容,并专门为理解和应用 PHP 的正则表达式增 加了一章全新的内容。例外,该版对 Java的章节也进行了修订,做了可观的扩充。反映了 Java 1.5 和Java 1.6 的新特性。 目标读者 Intended Audience 任何有机会使用正则表达式的人,都会对本书感兴趣。如果您还不了解正则表达式能够提供 的强大功能,这本书展示的全新世界将会让您受益匪浅。即使您认为自己已经是掌握正则表 达式的高手了,这本书也能够深化您的认识。第1版面世后,我时常会收到读者的电子邮件 反映说“读这本书之前,我以为自己了解正则表达式,但现在我才真正弄明白”。 以与文本打交道为工作(如 Web 开发)的程序员将会发现,这本书绝对称得上是座金矿, 因为其中蕴藏了各种细节、暗示、讲解,以及能够立刻投入到实用中的知识。在其他任何地 方都难以找到这样完整而详尽的资料。 正则表达式是一种思想——各种工具以各种方式(数目远远超过本书的列举)来实现它。如 果读者理解了正则表达式的基本思想,掌握某种特殊的实现就是易如反掌的事情。本书关注 的就是这种思想,所以其中的许多知识并不受例子中所用的工具软件和语言的束缚。 如何阅读 How to Read This Book 这本书既是教程,又是参考手册,还可以当故事看,这取决于读者的阅读方式。熟悉正则表 达式的读者可能会觉得,这本书马上就能当做一本详细的参考手册,读者可以直接跳到自己 需要的章节。不过,我并不鼓励这样做。 要想充分利用本书,可以把前 6章作为故事来读。我发现,某些思维习惯和思维方式的确有 助于完整的理解,不过最好还是从这几章的讲解中学习它们,而不是仅仅记住其中的几张列 表。 故事是这样的,前 6章是后面 4章——包括 Perl、Java、.Net 和PHP——的基础。为了帮助 读者理解每一部分,我交叉使用各章的知识,为了提供尽可能方便的索引,我投入了大量的 精力(全书中有超过 1200 处交叉引用,它们以符号加密码的形式标注)。 在读完整个故事以前,最好不要把本书作为参考手册。在开始阅读之前,读者可以参考其中 的表格,例如第 92 页的图表,想象它代表了需要掌握的相关信息。但是还有大量背景信息 没有包含在图标中,而是隐藏在故事里。读者阅读完整个故事后,会对这些问题有个清晰的 概念,哪些能够记起来,哪些需要温习。 组织结构 Organization 全书共 10 章,可以从逻辑上粗略地分为三类,下面是总体概览: 引导 第1章:介绍正则表达式的基本概念。 第2章:考察利用正则表达式进行文本处理的过程。 第3章:提供对于特性和工具软件的概述以及简史。 细节 第4章:揭示了正则表达式的工作原理的细节。 第5章:利用第 4章的知识,继续学习各种例子。 第6章:详细讨论效率问题。 特定工具的知识 第7章:详细讲解 Perl的正则表达式。 第8章:讲解 Sun 提供的 java.util.regex 包。 第9章:讲解.NET 的语言中的正则表达式包。 第10 章:讲解 PHP 中提供正则功能的 preg 套件。 引导部分会把完全的门外汉变成“对问题有感觉”的新手。对正则表达式有一定经验的读者 完全可以快速翻阅这些章节,不过,即使对于相当有经验的读者来说,我仍然要特别推荐第 3章。 第一章第一章第一章第一章 正则表达式入门正则表达式入门正则表达式入门正则表达式入门,完全是为门外汉准备的。我以应用相当广泛的程序 egrep 为例来 介绍正则表达式,我也提供了我的视角:如何“理解”正则表达式,为后面章节所包括的高 级概念打下坚实的基础。即使是有经验的读者,浏览本章也会有所收获。 第第第第2222章章章章 入门示例拓展入门示例拓展入门示例拓展入门示例拓展,考察了支持正则表达式的程序设计语言的真实文本处理过程。附加 的示例提供了后面章节详细讨论的基础,也展示了高级正则表达式调校背后的重要思考过 程。为了让读者学会“正则表达式的套路”,这章出现了一个复杂问题,并讲解了两种全然 不相关的工具如何分别通过正式表达式来解决他们。 第第第第3333章章章章 正则表达式的特性和流派概览正则表达式的特性和流派概览正则表达式的特性和流派概览正则表达式的特性和流派概览,提供了当前经常使用的工具的多种正则表达式的概 览。因为历史的混乱,当前常用的正则表达式的类型可能差异巨大。此章同时介绍了正则表 达式以及使用正则表达式的工具的历史和演化过程。本章末尾也提供了 “高级话题引导”。 此引导是读者学习此后高级内容的路线图。 细节 The Details 了解了基础知识之后,读者需要弄明白“如何使用”及“这么做的原因”。就像“授人以渔” 的典故一样,真正懂得正则表达式的读者,能够在任何时间、任何地点应用关于它的知识。 第第第第4444章章章章 表达式的匹配原理表达式的匹配原理表达式的匹配原理表达式的匹配原理,循序渐进的导入本书的核心。它从实践的角度出发,考察了正 则引擎真实工作的重要的内在机制。懂得正则表达式如何处理工作细节,对读者掌握它们大 有裨益。 第第第第5555章章章章 正则表达式实用技巧正则表达式实用技巧正则表达式实用技巧正则表达式实用技巧,教育读者在高层次和实际的运用中应用知识。这一章会详细 讲解常见(但复杂)的问题,目的在拓展和深化读者对正则表达式的认识。、 第第第第6666章章章章 打造高效的正则表达式打造高效的正则表达式打造高效的正则表达式打造高效的正则表达式,考察真实生活中大多数程序设计语言提供的正则表达式的 高效结果。本章运用了第 4章和第 5章详细讲解的知识,来发掘引擎的能力,绕开引擎的缺 陷。 特定工具的知识 Tool-Specific Information 学习完第 4、5、6章的读者,不需要知道特定的实现。不过,我还是用了 4个整章来讲解 4 种流行的语言。 第第第第7777章章章章 PerlPerlPerlPerl,详细讲解了 Perl 的正则表达式,Perl 大概是目前最流行的主要的正则表达 式编程语言。在 Perl 中,与正则表达式相关的操作符只有四个,但它们组合出的选项和特 殊情形带来了大量的程序选项——同时还有缺陷。对没有经验的开发人员来说,这种及其丰 富的选项能够让他们迅速从概念转向程序,当然也可能是雷场。本章的详细介绍有助于给读 者指出一条光明大道。 第第第第8888章章章章 JavaJavaJavaJava,详细介绍了 java.util.regex 包,从 Java 1.4 以后,它已经成为了 Java 语 言的标注部分。本章主要关注的是 Java 1.5,但也提及了它与 Java 1.42 和Java 1.6 的差 别。 第第第第9999章章章章 .NET.NET.NET.NET,是微软尚未提供的 .NET 正则表达式的文档。无论使用 VB.NET、C#、C++、 JScript、VBScript、ECMAScript 还是使用.NET 组件的其他语言,本章都提供了详细内容, 让读者能够充分利用.NET 的正则表达式。 第第第第10101010章章章章 PHPPHPPHPPHP,简要介绍了 PHP 内嵌的多个正则引擎,并详细介绍了 preg 正则表达式套件 (regex engine)的类型和 API,这些是由 PCRE 正则表达式库提供的。 在进行(或者谈论)详细的和复杂的文本处理时,保持精准性是很重要的。差一个空格字符 , 可能导致截然不同的结果,所以我会在本书中使用下面的惯例: � 正则表达式以「this」的形式出现,两端的符号表示“里面有一个正则表达式”,而正 则表达式文字(例如用来检索的表达式)以‘this’的形式出现。有时候,省略两端的 符号也不会造成歧义,此时我会忽略它们。同样,屏幕截图通常以原来的样子出现而不 会用到上面两种符号。 � 在文字文本和表达式内部的省略号会被特别标出。例如,[……]表示一对方括号,中间 的内容无关紧要,而[...]表示一对方括号,其中包含三个句点。 � 如果没有明确数字,可能很难判断“a b”之间有多少空格,所以出现在正则表达式 和文字文本中的空格以“·”表示。这样“a····b”就清楚多了。 � 我使用可见的制表符,换行符和回车字符: � 有时候,我会使用下划线或有色背景高亮标注文字文本或正则表达式的一部分。下面这 句话中,下划线的部分表示表达式真正匹配的部分: Because 「cat」matches ‘It·idicates·your·cat·is...’instead of the world ‘cat’, we realize... 在这个例子中,下划线的部分高亮标记了表达式中添加的字符: To make this useful, we can wrap 「Subject|Date」with parentheses, and a append a colon and a space. This yields 「(Subject|Date):·」 � 本书包含了大量的细节和例子,所以我设置了超过了 1200 处交叉引用,帮助读者理解。 他们通常表示为“见123”,意思是“请参阅第 123 页”。举 个 例 子 :“…的说明在表 8-2 中(见 367)”。 练习 Exercises 有时候我会问个问题,帮助读者理解正在讲解的概念。尤其是在前几章这种问题更多。它们 并不是摆设,我希望读者在继续阅读之前认真思想。记住我的话,不要忽略他们的重要意义 , 本书中这样的问题并不多。它们可以当做自我测试题:如果不是几句话就能说明的问题,最 好是在复习相关章节后再继续阅读。 为了避免读者直接看到问题的答案,我使用了一点技巧:问题的答案都必须翻页才能看到。 通常你必须翻过一页才能看到标着 的答案。这样答案在你思考问题的时候没法直接看到, · 空格字符 TAB 制表符 NL 换行符 CR 回车字符 但又很容易获得。 链接、代码、勘误及练习方式 Links、Code、Errata and Contacts 写本书第一版时,我发现修改书本上的 URL,保持与实际一致是件很费工夫的事情,所以, 我没有在书后罗列一个 URL 附录,而是提供统一的地址: http://regex.info ( 欢迎读者访问 FLEX中国站 http://www.flexchn.cn/) 在这里你可以找到与正则表达式相关的链接,书中的所有代码,可检索的缩影以及其他资源 。 本书也可能存在错误 ,所以我提供了勘误。 如果你找到书中的错误,或者仅仅是希望给我写几句话,请写邮件到:jfriedl@regex.info 奥莱理软件(北京)有限公司 北京市 海淀区 知春路 49 号 希格玛公寓 B座809 室 邮政编码:100080 网页:http://www.oreilly.com.cn E-mail:info@mail.oreilly.com.cn 与本书有关的在线信息如下: http://www.oreilly.com/catalog/regex3/ (原书) http://www.oreilly.com.cn/book.php?bn=978-7-121-04684-1 (中文版) 北京博文视点资讯有限公司(武汉分部) 湖北省 武汉市 洪山区 吴家湾 邮科院路特 1号 湖北信息产业科技大厦 1402 室 邮政编码:430074 电话:(027) 87690813 传真:(027) 87690595 网页:http://bv.csdn.net 读者服务信箱: reader@broadview.com.cn (读者信箱) bvtougao@gmail.com (投稿信箱) 第1章 正则表达式入门 Introduction to Regular Expressions 想象一下这幅图景:你需要检索某台 web 服务器上的页面中的重复单词(例如“this this”), 进行大规模文本编辑时,这是一项常见的任务。程序必须满足下面的要求: � 能检查多个文件,挑出包含重复单词的行,高亮标记每个重复单词(使用标准 ANSI 的 转义字符序列(escape sequence)),同时必须显示这行文字来自哪个文件。 � 能跨行查找,即使两个单词一个在某行末尾而另一个在下一行的开头,也算重复单词。 � 能进行不区分大小写的查找,例如“The the...”,重复单词之间可以出现任意数量的空 白字符(空格符、制表符、换行符之类)(译注 1)。 � 能查找同 HTML tag 分隔的重复单词。 HTML tag 用于标记互联网页上的文本,例如, 粗体单词是这样表示的:‘... it is very very important ...’。 这些问题并不容易解决,但又不能不解决。我在写作本书的手稿时,曾用一个工具来检查已 经写好的部分,我惊奇的发现,其中竟有那么多的重复单词。能够解决这种问题的编程语言 有许多,但使用支持正则表达式的语言来处理会相当简单。 正则表达式(Regular Expression)是强大、便捷、高效的文本处理工具。正在表达式本身, 加上如同一门袖珍编程语言的通用模式表示法(general pattern notation),赋予使用者描述和 分析文本的能力。配合上特定工具提供的额外支持,正则表达式能够添加、删除、分离、叠 加、插入和修整各种类型的文本和数据。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档