正则表达式的思维框架

04-13Ctrl+D 收藏本站

关灯 直达底部

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能够理解文件中的字节和行,但它完全不理解英语(或者其他任何语言)的单词、句子、段落,或者是其他复杂概念。