返回介绍

8.1 正前瞻

发布于 2024-01-20 21:40:46 字数 2004 浏览 0 评论 0 收藏 0

假设要匹配单词ancyent,且要求紧随其后的单词是marinere(为与文件中的单词一致,我采用了古代拼写法)。要达到这个目的,我们可以使用正前瞻。

首先在RegExr桌面版程序中试一下。将下面这个不区分大小写的模式输入到顶部的文本框内:

(?i)ancyent (?=marinere)

在RegExr中,还可以勾选ignoreCase旁的复选框来指定不区分大小写,这两种方式都是可以的。

由于我们使用了不区分大小写的选项(?i),就不必担心模式中用的大小写形式了。现在就是在每一行中寻找后跟marinere的单词ancyent。结果会在模式区域下面的文本区中标亮(参见图8-1);但只有模式的第一部分(ancyent)是被标亮的,环视模式(Marinere)不会标亮。

图8-1 RegExr 中的正前瞻

现在使用Perl来做正前瞻。你可以写这样一个命令:

 perl -ne 'print if (?i)ancyent (?=marinere)' rime.txt

其输出如下:

THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.
How a Ship having passed the Line was driven by Storms to the cold Country towards
the South Pole; and how from thence she made her course to the tropical Latitude of
the Great Pacific Ocean; >and of the strange things that befell; and in what manner the
Ancyent Marinere came back to his >own Country.
It is an ancyent Marinere,
"God save thee, ancyent Marinere!
"I fear thee, ancyent Marinere!

该诗有五行内容中的ancyent出现在marinere之前。如果要求ancyent之后的单词以大写或小写字母m开头,该如何做呢?可以这样:

perl -ne 'print if (?i)ancyent (?=m)' rime.txt

现在除了Marinere,跟在后面的还可以有man和Man:

And thus spake on that ancyent man,
And thus spake on that ancyent Man,

ack也可以使用环视功能,这是因为它是由Perl语言编写的。ack的命令行界面与grep十分相似。

试一下这个命令:

ack '(?i)ancyent (?=ma)' rime.txt

你会看到高亮显示的结果,如图8-2所示。

图8-2 在终端中使用ack进行正前瞻查找

使用ack时,可以用命令行选项-i指定不区分大小写,而不使用嵌入选项(?i):

ack -i 'ancyent (?=ma)' rime.txt

若要在ack的输出中添加行号以方便计数,可以采用多种方法。比如可以加上-H选项:

ack -Hi 'ancyent (?=ma)' rime.txt

也可以添加带有--output选项的代码:

ack -i --output '$.:$_' 'ancyent (?=ma)' rime.txt

这有点不太正统——关闭了标亮功能,但它确实起作用了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文