精通正则表达式(第3版)(txt+pdf+epub+mobi电子书下载)

作者:(美)杰佛瑞E.F.佛瑞德

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

精通正则表达式(第3版)

精通正则表达式(第3版)试读:

前言

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

本书的第1 版写于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的章节也进行了修订,做了可观的扩充,反映了Java1.5和Java1.6的新特性。

目标读者

Intended Audience

任何有机会使用正则表达式的人,都会对本书感兴趣。如果您还不了解正则表达式能提供的强大功能,这本书展示的全新世界将会让您受益匪浅。即使您认为自己已经是掌握正则表达式的高手了,这本书也能够深化您的认识。第 1 版面世后,我时常会收到读者的电子邮件反映说“读这本书之前,我以为自己了解正则表达式,但现在我才真正了解”。

以与文本打交道为工作(如Web开发)的程序员将会发现,这本书绝对称得上是座金矿,因为其中蕴藏了各种细节、暗示、讲解,以及能够立刻投入到实用中的知识。在其他任何地方都难以找到这样丰富的细节。

正则表达式是一种思想——各种工具以各种方式(数目远远超过本书的列举)来实现它。如果读者理解了正则表达式的基本思想,掌握某种特殊的实现就是易如反掌的事情。本书关注的就是这种思想,所以其中的许多知识并不受例子中所用的工具软件和语言的束缚。

如何阅读

How to Read This Book

这本书既是教程,又是参考手册,还可以当故事看,这取决于读者的阅读方式。熟悉正则表达式的读者可能会觉得,这本书马上就能当作一本详细的参考手册,读者可以直接跳到自己需要的章节。不过,我并不鼓励这样做。

要想充分利用这本书,可以把前 6 章作为故事来读。我发现,某些思维习惯和思维方式的确有助于完整的理解,不过最好还是从这几章的讲解中学习它们,而不是仅仅记住其中的几张列表。

故事是这样的,前6 章是后面4 章——包括Perl、Java、.NET和PHP——的基础。为了帮助读者理解每一部分,我交叉使用各章的知识,为了提供尽可能方便的索引,我投入了大量的精力(全书中有超过1 200处交叉引用,它们以符号加页码的形式标注)。

在读完整个故事以前,最好不要把本书作为参考手册。在开始阅读之前,读者可以参考其中的表格,例如第92页的图表,想象它代表了需要掌握的相关信息。但是,还有大量背景信息没有包含在图表中,而是隐藏在故事里。读者阅读完整个故事之后,会对这些问题有个清晰的概念,哪些能够记起来,哪些需要温习。

组织结构

Organization

全书共10 章,可以从逻辑上粗略地分为三类,下面是总体概览:

导引

第1章:介绍正则表达式的基本概念。

第2章:考察利用正则表达式进行文本处理的过程。

第3章:提供对于特性和工具软件的概述以及简史。

细节

第4章:揭示了正则表达式的工作原理的细节。

第5章:利用第4章的知识,继续学习各种例子。

第6章:详细讨论效率问题。

特定工具的知识

第7章:详细讲解Perl的正则表达式。

第8章:讲解Sun提供的java.util.regex包。

第9章:讲解.NET的语言中立的正则表达式包。

第10章:讲解PHP中提供正则功能的preg套件。

导引部分会把完全的门外汉变成“对问题有感觉”的新手。对正则表达式有一定经验的读者完全可以快速翻阅这些章节,不过,即使是对于相当有经验的读者来说,我仍然要特别推荐第3章。

第1章 正则表达式入门

,是为完全的门外汉准备的。我以应用相当广泛的程序egrep为例来介绍正则表达式,我也提供了我的视角:如何“理解”正则表达式,来为后面章节所包括的高级概念打下坚实的基础。即使是有经验的读者,浏览本章也会有所收获。

●第2章 入门示例拓展,考察了支持正则表达式的程序设计语言的真实文本处理过程。附加的示例提供了后面章节详细讨论的基础,也展示了高级正则表达式调校背后的重要思考过程。为了让读者学会“正则表达式的套路”,这章出现了一个复杂问题,并讲解了两种全然不相关的工具如何分别通过正则表达式来解决它。

●第3章 正则表达式的特性和流派概览,提供了当前经常使用的工具的多种正则表达式的概览。因为历史的混乱,当前常用的正则表达式的类型可能差异巨大。此章同时介绍了正则表达式以及使用正则表达式的工具的历史和演化历程。本章末尾也提供了“高级话题引导”。此引导是读者学习此后高级内容的路线图。

细节

The Details

了解了基础知识之后,读者需要弄明白“如何使用”及“这么做的原因”。就像“授人以渔”的典故一样,真正懂得正则表达式的读者,能够在任何时间、任何地点应用关于它的知识。

●第4章 表达式的匹配原理,循序渐进地导入本书的核心。它从实践的角度出发,考察了正则引擎真实工作的重要的内在机制。懂得正则表达式如何处理工作细节,对读者掌握它们大有裨益。

●第5章 正则表达式实用技巧,教育读者在高层次和实际的运用中应用知识。这一章会详细讲解常见(但复杂)的问题,目的在于拓展和深化读者对于正则表达式的认识。

●第6章 打造高效正则表达式,考察真实生活中大多数程序设计语言提供的正则表达式的高效结果。本章运用第4章和第5章详细讲解的知识,来开发引擎的能力,并避免其中的缺陷。

特定工具的知识

Tool-Specific Information

学习完第4、5、6 章的读者,不太需要知道特定的实现。不过,我还是用了 4 个整章来讲解4种流行的语言。

●第7章 Perl,详细讲解了Perl的正则表达式,Perl大概是目前最流行的主要的正则表达式编程语言。在Perl中,与正则表达式相关的操作符只有四个,但它们组合出的选项和特殊情形带来了大量的程序选项——同时还有陷阱。对没有经验的开发人员来说,这种极其丰富的选项能够让他们迅速从概念转向程序,当然也可能是雷场。本章的详细介绍有助于给读者指出一条光明大道。

●第8章 Java,详细介绍了java.util.regex包,从Java 1.4以后,它已经成为了Java语言的标准部分。本章主要关注的是Java 1.5,但也提及了它与Java 1.4.2和Java 1.6的差别。

●第9章.NET,是微软尚未提供的.NET正则表达式库的文档。无论使用VB.NET、C#、C++、JScript、VBScript、ECMAScript还是使用.NET组件的其他语言,本章都提供了详细内容,让读者能够充分利用.NET的正则表达式。

●第10章 PHP,简要介绍了PHP内嵌的多个正则引擎,并详细介绍了preg正则表达式套件(regex engine)的类型和API,这些是由PCRE正则表达式库提供的。

体例说明

Typographical Conventions

在进行(或者谈论)详细的和复杂的文本处理时,保持精确性是很重要的。差一个空格字符,可能导致截然不同的结果,所以我会在本书中使用下面的惯例:「

●正则表达式以this的形式出现。两端的符号表示“里面有一」个正则表达式”,而正则表达式文字(例如用来检索的表达式)以‘this’的形式出现。有时候,省略两端的符号和单引号也不会造成歧义,此时我会省略它们。同样,屏幕截图通常以原来的样子出现,而不会用到上面两种符号。

●在文字文本和表达式内部的省略号会被特别标出。例如,[…]表示一对方括号,之间的内容无关紧要,而[…]表示一对方括号,其中包含三个句点。

●如果没有明确数字,可能很难判断“a b”之间有多少空格,所以出现在正则表达式和文字文本中的空格以“·”表示。这样“a····b”就清楚多了。

●我使用可见的制表符,换行符和回车字符:

●有时候,我会使用下画线或有色背景高亮标注文字文本或正则表达式的一部分。下面这句话中,下画线的部分表示表达式真正匹配的部分:「

Because catmatches」'instead of the word'cat',we realize...

这个例子中,下画线的部分高亮标记了表达式中添加的字符:「

To make this useful,we can wrap Subject|Date with 」parentheses,and append a colon and a space.This yields

●本书包含了大量的细节和例子,所以我设置了超过1 200 处的交叉引用,帮助读者理解。它们通常表示为“☞123”,意思是“请参阅第 123 页”。举个例子:“…的说明在表8-2中(☞367)”。

练习

Exercises

有时候我会问个问题,帮助读者理解正在讲解的概念,尤其是在前几章这种问题更多。它们并不是摆设,我希望读者在继续阅读之前认真想想。请记住我的话,不要忽略它们的重要意义,本书中这样的问题并不多。它们可以当作自我测试题:如果不是几句话就能说明白的问题,最好是在复习相关章节之后再继续阅读。

为了避免读者直接看到问题的答案,我使用了一点技巧:问题的答案都必须翻页才能看到。通常你必须翻过一页才能看到标着ϖ的答案。这样答案在你思考问题的时候没法直接看到,但又很容易获得。

链接、代码、勘误及联系方式

Links,Code,Errata,and Contacts

写第1 版时,我发现修改书本上的URL,保持与实际一致是件很费工夫的事情,所以,我没有在书后罗列一个URL附录,而是提供统一的地址:

http://regex.info

在这里你可以找到与正则表达式相关的链接,书中的所有代码,可检索的索引以及其他资源。本书也可能存在错误☺,所以我提供了勘误。

如果你找到书中的错误,或者仅仅是希望给我写几句话,请写邮件到: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章 正则表达式入门Introduction to Regular Expressions

想象一下这幅图景:你需要检索某台Web服务器上的页面中的重复单词(例如“this this”),进行大规模文本编辑时,这是一项常见的任务。程序必须满足下面的要求:

●能检查多个文件,挑出包含重复单词的行,高亮标记每个重复单词(使用标准 ANSI的转义字符序列(escape sequence)),同时必须显示这行文字来自哪个文件。

●能跨行查找,即使两个单词一个在某行末尾而另一个在下一行的开头,也算重复单词。

●能进行不区分大小写的查找,例如‘The the…’,重复单词之间可以出现任意数量的空白字符(空格符、制表符、换行符之类)(译注1)。

●能查找用HTML tag分隔的重复单词。HTML tag用于标记互联网页上的文本,例如,粗体单词是这样表示的:‘…it is <B>very</B> very important…’。

这些问题并不容易解决,但又不能不解决。我在写作本书的手稿时,曾用一个工具来检查已经写好的部分,我惊奇地发现,其中竟有那么多的重复单词。能够解决这种问题的编程语言有许多,但是用支持正则表达式的语言来处理会相当简单。

正则表达式(Regular Expression)是强大、便捷、高效的文本处理工具。正则表达式本身,加上如同一门袖珍编程语言的通用模式表示法(general pattern notation),赋予使用者描述和分析文本的能力。配合上特定工具提供的额外支持,正则表达式能够添加、删除、分离、叠加、插入和修整各种类型的文本和数据。

正则表达式的使用难度只相当于文本编辑器的搜索命令,但功能却与完整的文本处理语言一样强大。本书将向读者展示正则表达式提高生产率的诸多办法。它会教导读者如何学会用正则表达式来思考(think regular expressions),以便于掌握它们,充分利用它们的强大功能。

如果使用当今流行的程序设计语言,解决重复单词问题的完整程序可能仅仅只需要几行代码。使用一个正则表达式的搜索和替换命令,读者就可以查找文档中的重复单词,并把它们标记为高亮。加上另一个,你可以删除所有不包含重复单词的行(只留下需要在结果中出现的行)。最后,利用第三个正则表达式,你可以确保结果中的所有行都以它所在文件的名字开头。在下一章里,我们会看到用Perl和Java编写的程序。

宿主语言(例如Perl、Java以及VB.NET)提供了外围的处理支持,但是真正的能力来自正则表达式。为了驾驭这种语言,满足自己的需求,读者必须知道如何构建正则表达式,才能识别符合要求的文本,同时忽略不需要的文本。然后,就可以把表达式和语言支持的构建方式结合起来,真正处理这些文本(加入合适的高亮标记代码,删除文本,修改文本,等等)。

解决实际问题

Solving Real Problems掌握正则表达式,可能带来超乎你之前想象的文本处理能力。每一天,我都依靠正则表达式解决各种大大小小的问题(通常的情况是,问题本身并不复杂,但没有正则表达式就成了大问题)。

要说明正则表达式的价值,可以举一个用正则表达式解决大而重要的问题的例子,但是它不一定能代表正则表达式在平时解决的那些“不值一提”(uninteresting)的问题。这里的“不值一提”是指这类问题并不能成为谈资,可是不解决它们,你就没法继续干活。

举个简单的例子,我需要检查许多文件(事实上,本书的手稿存放在 70 个文件中),确保每一行中‘SetSize’出现的次数与‘ResetSize’的一样多。为了应付复杂的情况,我还需要考虑大小写的情况(举例来说,‘setSIZE’也算做‘SetSize’)。人工检查 32 000 行文字显然不现实。

即便使用文本编辑器的“单词查找”功能,也不够方便,尤其是对所有文件进行同样的操作,何况还需要考虑所有可能的大小写情况。

正则表达式就是解决这个问题的灵丹妙药。只需要一个简单的命令,我就能够检查所有的文件,获得我需要知道的结果。时间是:写命令大概15秒,检索所有的数据实际只花了2秒。这真是棒极了(如果您想知道这是怎么做到的,不妨现在就翻到第36页)!

再举一个例子,我曾帮助一个朋友处理远端机器上的某些 E-mail,他希望我把他邮箱文件中的消息作为列表发送给他。我可以把整个文件导入文本编辑器,手工删除所有信息,只留下邮件头中的几行,作为内容的列表。尽管文件不是很大,连接速度也不算慢,这样的任务还是很耗费时间而且很乏味。而且,窥见他的邮件正文,也令我尴尬。

正则表达式再一次提供了帮助!我用一个简单的命令(使用本章稍后提到的一个常用工具egrep)显示每封邮件的From:和Subject:字段。为了告诉egrep我需要提取哪些行,我使用了正则表达式「^(From|Sbuject):。」

朋友得到这个列表之后,让我找一封特殊的(5 000 行!)邮件。使用文本编辑器或者邮件系统来提取一封邮件无疑非常耗时。相反,我借助另一个工具(叫做 sed),同样使用正则表达式来描述文件中我需要的内容。这样,我能迅速而方便地提取和发送需要的邮件。

使用正则表达式节省下来的时间或许并不能让人“激动”,但总比把时间消耗在文本编辑器中要好。如果我不知道有正则表达式这种玩意儿,根本就不会想到还有别的解决办法。所以,这个故事告诉我们,正则表达式和相关的工具能够让我们以可能未曾想过的方式来解决问题。

一旦掌握了正则表达式,你就会知道到它简直是工具中的无价之宝,你也难以想象之前那些没有正则表达式的日子是怎么度过的(注1)。

全面掌握正则表达式是很有用的。本书提供了掌握这种技能所需要的信息,我同时也希望,这本书也提供了促使你学习的动机。

作为编程语言的正则表达式

Regular Expressions as a Language如果没有正则表达式相关经验,读者可能无法理解「上个例子中正则表达式^(From|Subject):的意」义,但是这个表达式并没有什么神奇之处。其实魔术本身也不神奇,只是缺乏训练的普通观众不明白魔术师掌握的那些技巧而已。如果你也懂得如何在手中藏一张牌,那么,熟练之后,你也可以“变魔术”。外语也是这样——一旦掌握了一门外语,你就不会觉得它像天书了。

以文件名做类比

The Filename Analogy

选择这本书的读者,大概对“正则表达式” 多少有点认识。即便没有,也应该熟悉其中的基本概念。

我们都知道,report.txt是一个文件名,但是,如果你用过Unix或者DOS/Windows的话,就会知道“*.txt”能够用来选择多个文件。在此类文件名(称为“文件群组”file globs或者“通配符”wildcards)中,有些字符具有特殊的意义。星号表示“任意文本”,问号表示“任意单个字符”。所以,文件群组“*.txt”以能够匹配字「符的*符号开头,以普通文字「.txt结尾,所以,它的意思是:」」选择以任意文本开头,以.txt结尾的所有文件。

大多数系统都提供了少量的附加特殊字符(additional special characters),但是,总的来说,这些文件名模式(filename patterns)的表达能力还很有限。不过,因为这类问题的领域很狭窄——只涉及文件名,所以这算不上缺陷。

不过,处理普通的文本就没有这么简单了。散文、诗、程序代码、报表、HTML、表格、单词表……到你想得出的任何文本。如果某种特殊的需求足够专业,例如“选择文件”,我们可以发明一些特殊的办法和工具来解决问题。不过,近年来,一种“通用的模式语言”(generalized pattern language)已经发展起来,它功能强大,描述能力也很强,可以用来解决各种问题。不同的程序以不同的方式来实现和使用这种语言,但是综合来说,这种功能强大的模式语言和模式本身被称为“正则表达式”(regular expression)。

以语言做类比

The Language Analogy

完整的正则表达式由两种字符构成。特殊字符(special characters,例如文件名例子中的*)称为“元字符”(metacharacters),其他为“文字”(literal),或者是普通文本字符(normal text characters)。正则表达式与文件名模式(filename pattern)的区别就在于,正则表达式的元字符提供了更强大的描述能力。文件名模式只为有限的需求提供了有限的元字符,但是正则表达式“语言”为高级应用提供了丰富而且描述力极强的元字符。

为了便于理解,我们可以把正则表达式想象为普通的语言,普通字符对应普通语言中的单词,而元字符对应语法。根据语言的规则,按照语法把单词组合起来,就会得到能传达思想的文本。在 E-mail 的例子中,我用正则表达式来寻找以‘From:’或者‘Subject:’开头的行。下画线标注的就是特殊字符,稍后我们将解释它们的含义。

就像学习任何一门外语一样,第一眼看上去,正则表达式很不好理解。这也是那些对它只有粗浅了解或者根本不了解的人觉得正则表达式很神奇的原因。但是,就像学日语的人很快就能理解正規表現は簡簡だよ!(注 2)一样,读者很快也能够彻底明白下面这个正则表达式的含义:

s!<emphasis>([0-9]+(\.[0-9]+){3})</emphasis>!<inet>$1</inet>!

这个例子取自一个 Perl 脚本,我的编辑器用它来修改手稿。手稿的作者错误地使用了<emphasis>这个tag来标注IP地址(类似209.204.146.22这样由数字和点号构成的字符串)。其中的奥妙就在于使用Perl的文本替换命令,使用:

「<emphasis>([0-9]+(\.[0-9]+){3})</emphasis>」

把IP地址两端的tag替换为<inet>,而不改动其他的<emphasis>标签。在后面的章节中,读者会了解这个表达式的构造细节,然后就能按照自己的需求,在自己的应用程序或者开发语言中应用这些技巧。

本书的目的

你或许不需要重复把<emphasis>替换为<inet>的工作,不过很可能需要解决“把这些文字替换为那些文字”的问题。本书的目的不是提供具体问题的解决办法,而是教会读者利用正则表达式来思考,解决遇到的各种问题。

正则表达式的思维框架

The Regular-Expression Frame of Mind我们将会看到,完整的正则表达式由小的构建模块单元(building block unit)组成。每个单独的构建模块都很简单,不过因为它们能够以无穷多种方式组合,将它们结合起来实现特殊目标必须依靠经验。所以,本章提供了有关正则表达式的若干概念的总体描述。这一章并没有艰深的内容,而是为本书其余章节的知识打下基础,在深入探索正则表达式之前,把相关事宜阐释清楚。

某些例子看起来可能有点无聊(因为它们确实无聊),但它们代表了一类需要完成的任务,只是读者目前可能还没有意识到。即使觉得每个例子的意义都不大也不必担心,慢慢理解其中的道理就好。这就是本章的目的。

对于有部分经验的读者

If You Have Some Regular-Expression Experience

如果读者已经熟悉正则表达式,这些综述便没有太大价值,但务必不要忽略它们。你或许明白某些元字符的基本意义,但某些思维和看待正则表达式的方式可能是你不了解的。

就像真正懂演奏和仅仅会弹奏之间差别迥异一样,了解正则表达式和真正理解正则表达式并不是一回事。某些内容可能会重复读者已经了解的知识,但方式可能与之前的不同,而且这些方式正是真正理解正则表达式的第一步。

检索文本文件:Egrep

Searching Text Files:Egrep

文本检索是正则表达式最简单的应用之一——许多文本编辑器和文字处理软件都提供了正则表达式检索的功能。最简单的就是egrep。在指定了正则表达式和需要检索的文件之后,egrep会尝试用正则表达式来匹配每个文件的每一行,并显示能够匹配的行。

许多系统——例如DOS、MacOS、Windows、Unix等等——都对应有免费提供的egrep。在本书的网页http://regex.info上可以找到获得对应读者操作系统的egrep拷贝的链接。

回到第3页的E-mail的例子,真正用来从E-mail文件中提取结果的命令如图1-1所示。egrep把第一个命令行参数视为一个正则表达式,剩下的参数作为待搜检索的文件名。注意,图1-1中的单引号并不是正则表达式的一部分,而是根据command shell需要添加的(注3)。使用egrep时,我通常用单引号来包围正则表达式。如果要在支持对正则表达式提供了完整支持的程序设计语言中使用正则表达式——这是下一章开头的内容,重要的问题是知道特殊字符有哪些,具体文本是什么,针对什么对象(什么表达式,什么工具软件),以及按何种顺序解释这些字符。图1-1:通过命令行调用egrep

我们马上就能明白,这个正则表达式的各个部分都是什么意思,但已经知道某些字符具有特殊含义的读者或许能够猜出大概了。在这「「里,^和|都是正则表达式的元字符,它们与其他字符结合起来,」」实现我们期望的功能。

如果一个正则表达式不包括任何egrep支持的元字符,它就成了「一个简单的“纯文本”检索。例如,在一个文件中检索cat,会显」示任何包含 c·a·t这 3 个连续字母的行。例如,它包括所有出现了的行。

即便这行文本中不包含单词 cat,vacation中包含的 c·a·t序列仍然符合匹配条件。如果某行中包含 vacation,egrep 就会把它显示出来。关键就在于,此处进行的正则表达式搜索不是基于“单词”的——egrep能够理解文件中的字节和行,但它完全不理解英语(或者其他任何语言)的单词、句子、段落,或者是其他复杂概念。

Egrep元字符

Egrep Metacharacters现在我们来看egrep中支持正则表达式功能的元字符。我会用几个例子来简要介绍它们,把详细的例子和描述留到后面的章节。

印刷体例 在开始之前,请务必回顾前言第V页上解释的体例说明。本书使用了一些新的文字形式,所以某些体例读者初次接触可能并不熟悉。

行的起始和结束

Start and End of the Line「「

或许最容易理解的元字符就是脱字符号^和美元符号$」」「「了,在检查一行文本时,^代表一行的开始,$代表结束。我」」「们曾经看到,正则表达式cat寻找的是一行文本中任意位置的c·a·t,」

「「但是^cat只寻找行首的 c·a·t——^用来把匹配文本(这个表达」」式的其他部分匹配的字符)“锚定”(anchor)在这一行的开头。同样,「cat$只寻找位于行末的c·a·t,例如以scat结尾的行。」

读者最好能养成按照字符来理解正则表达式的习惯。例如,不要这样:

「^cat匹配以cat开头的行」

而应该这样理解:

「^cat匹配的是以c作为一行的第一个字符,紧接一个a,紧接」一个t的文本。

这两种理解的结果并无差异,但按照字符来解读更易于明白新遇「「到的正则表达式的内部逻辑。egrep会如何解释^cat$、^$和单」」

「个的^呢?ϖ 请翻到下页查看答案。」

脱字符号和美元符号的特别之处就在于,它们匹配的是一个位置,而不是具体的文本。当然,有很多方式可以匹配具体文本。在正「则表达式中,除了使用cat之类的普通字符,还可以使用下面几节」介绍的元字符。

字符组

Character Classes

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?