对话 UNIX,第 9 部分: 正则表达式( 四 )


以下是其他一些示例:
可以使用 {2,} 查找两次或多次重复 。regex ^G[o]{2,}gle 匹配 Google、Gooogle、Goooogle 等等 。
重复修饰符 ?、和 * 分别查找零次或一次、一次或多次,以及零次或多次重复 。(例如,您可以将 ? 看作是 {0,1} 的简写法 。) regex boys? 匹配 boy 或 boys;regex Goo?gle 匹配 Gogle 或 Google 。
regex Goo gle 匹配 Google、Gooogle、Goooogle 等等 。
construct Goo*gle 匹配 Gogle、Google、Gooogle 等等 。
可以将重复修饰符应用到单个字符(如上所示),还可以应用到更复杂的组合 。使用 ( 和 ) 圆括号(就像数学中的用法)将修饰符应用到子表达式 。下面是一个示例:给定文本文件 test.txt:The rain in Spain falls mainly
on the the plain.
It was the best of of times;
it was the worst of times.
命令 grep -i -E '(b(of|the)W ){2,}' test.txt 将生成:
on the the plain.
It was the best of of times;
regex 操作符 b 匹配单词边界 或 (Ww|wW) 。该 regex 表示“一连串完整单词‘the’或‘of’后面紧跟非文字字符 。您可能会提出疑问,为什么 W是必需的:b 是位于单词开头或结尾的空字符串 。在单词之间必须包括这一(或这些)字符,否则该 regex 将无法找到匹配 。
捕获需要注意的内容
查找文本是常见的问题,但是更常见的问题则是希望在找到文本之后将其提取出来 。换句话说,您希望去粗取精 。
正则表达式通过捕获 来提取信息 。如果希望将需要的文本与其他内容分开,请使用圆括号将模式括起来 。实际上,您已经使用圆括号收集术语;在默认情况下,圆括号自动进行捕获 。
要查看捕获,请切换到 Perl 。(grep 实用工具不支持捕获,因为其目标是打印包含模式的行 。)
以下命令:
perl -n -e '/^Thes (.*)$/ && print "$1n"' heroes.txt
将打印:
Tick
Punisher
使用命令 perl -e 可以直接从命令行运行 Perl 程序 。perl -n 命令针对输入文件的每一行运行一次程序 。命令的 regex 部分,即位于斜杠之间的文本(/)表示“匹配字符串的开头,然后字母‘T’、‘h’、‘e’后紧跟一个或多个空格字符 s,然后捕获直到字符串结尾的所有字符 。
Perl 捕获内容被放在以 $1 开头的特殊 Perl 变量中 。Perl 程序的其余部分打印捕获的内容 。
每个嵌套的括号对,从左开始算起,每个左圆括号加一,放在下一个特殊的数字变量中 。例如:
perl -n -e '/^(w) -(w )$/ && print "$1 $2"'
将生成:
Spider Man
Ant Man
Spider Woman
捕获感兴趣的文本仅仅是隔靴搔痒 。如果能够准确确定材料,就可以使用其他材料改变其外观 。类似于 vi 和 Emacs 的编辑器将模式匹配与替换组合,从而将查找和替换文本组合成一步操作 。还可以使用模式、替换和 sed 从命令行更改文本 。
丰富的主题
正则表达式非常强大;可供使用的操作符的数量庞大,种类繁多 。它包含如此丰富的信息和实践知识,我们在这里所能列举的实属凤毛麟角 。
幸运的是,有以下三种优秀的正则表达式理论来源可供使用:
如果在您的系统上有 Perl,可以参阅 Perl Regular Expression man 页面(键入 perldoc perlre) 。它会提供 regex 的精彩介绍,并包含许多有用的示例 。许多编程语言都已采用 Perl 兼容的正则表达式 (PCRE),因此您在此 man 页面读到的内容已被直接转换到 PHP、Python、Java? 和 Ruby 编程语言,以及许多其他最新工具 。
Jeffrey FrIEdl 编著的《正则表达式》(第三版)被认为是 regex 用法方面的圣经 。该书细致、准确、清晰、务实地说明了匹配的工作方式、所有的 regex 操作符、多数优先性(限制和 * 匹配字符的数量),以及更多内容 。此外,Friedl 的书还包括一些令人惊叹的正则表达式,可以准确地匹配完全限定的电子邮件地址和其他 Request for Comments (RFC) 特定的字符串 。

推荐阅读