第1章 正则表达式入门

04-13Ctrl+D 收藏本站

关灯 直达底部

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