返回介绍

2.7 给文本加标签

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

怎么让“The Rime of the Ancient Mariner”的内容以网页而不是纯文本形式显示呢?换句话说,怎么使用正则表达式而不是手写方式为它们添加HTML5标签呢?

在之后的几章中,我会陆续展示相应的方法,本章先从简单情况的开始。

点击RegExr中的Replace(替换)标签,选中multiline(多行)选项,然后在第一个文本框中键入:

(^T.*$)

这个表达式会从文件的开始匹配诗文的第一行,然后使用括号将文本捕获到一个分组中。在第二个文本框中键入:

<h1>$1<\h1>

这个替换表达式将$1捕获的内容嵌套在了h1标签中。可以在底部的文本框中看到结果。$1是一个Perl风格的后向引用。此外,在包括Perl在内的多数实现程序中,还可以使用\1表示后向引用,但是RegExr只支持$1、$2、$3这样的方式。我们会在第4章中讲解更多有关分组和后向引用的内容。

2.7.1 用sed为文本加标签

在命令行中使用sed也可以为文本添加标签。sed是Unix流编辑器,它支持用正则表达式转换文本。sed最初在20世纪70年代早期由Lee McMahon于贝尔实验室开发。如果用户使用的是Mac或者Linux,那就已经有sed了。

请在shell提示符(比如Mac中的Terminal终端窗口)中测试以下内容:

echo Hello | sed s/Hello/Goodbye/

运行的过程应该如下:

· echo命令将在标准输出设备(通常是屏幕)中打印单词Hello,竖线符(|)将打印内容通过管道传到之后的sed命令;

· 管道将echo的输出转为sed的输入;

· sed的s命令将单词Hello变为Goodbye,而Goodbye就显示在屏幕上了。

如果你的平台上还没有安装sed,可以参考本章末尾相关资源中的链接。其中还讨论了BSD和GNU两个版本的sed。

现在试着在命令或shell提示符中键入:

sed -n 's/^/<h1>;s$/<\/h1>/p;q' rime.txt

而输出就是:

<h1>THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.</h1>

以下是正则表达式处理器的工作过程解析。

· 首先调用sed程序。

· sed默认的操作是直接复制每行输入并输出,-n选项覆盖了该默认操作。之所要覆盖默认操作,是因为我们只想让正则表达式影响第1行。

· s/^/<h1>/在行的开头(^)添加<h1>标签。

· 分号(;)用于分隔命令。

· s/$/<\/h1>/在行的结尾($)添加</h1>标签。

· 命令p会打印受影响的那一行(第1行)。与-n不同,后者会打印所有行。

· 最后命令q会结束程序,这样sed程序就只会处理第1行。

· 所有的操作都是针对rime.txt文件执行的。

这行命令还有另一种写法,即用-e选项分别引导每个命令。我当然更喜欢使用带分号的写法,因为那种写法更简短。

 sed -ne 's/^/<h1>/' -e 's/$/<\/h1>/p' -e 'q' rime.txt

可以将这些命令写到文件里,比如这里所示的文件h1.sed(该文件就在之前所说的代码库里):

#!/usr/bin/sed

s/^/<h1>/
s/$/<\/h1>/
q

若要运行该文件,请在与rime.txt同一个路径或文件夹里运行如下命令:

sed -f h1.sed rime.txt

2.7.2 用Perl为文本加标签

最后,我将展示如何用Perl来做类似的事。Perl是由Larry Wall于1987年创立的一种通用程序设计语言。它以对正则表达式的强大支持和文本处理能力而闻名。

在命令提示符中键入

perl –v

然后回车,看看你的系统中是否已经安装了Perl。该命令会返回系统中Perl的版本信息或者返回错误(参见2.9节)。

在命令提示符中键入:

perl -ne 'if ($. == 1) { s/^/<h1>/; s/$/<\/h1>/m; print; }' rime.txt

就可以得到和sed示例中一样的输出结果:

<h1>THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.</h1>

以下是这个Perl命令的执行过程解析。

· perl调用了Perl程序。

· -n选项输出全部输入内容(rime.txt文件)。

· -e选项允许在命令行(而不用在文件)中提交程序代码。

· if语句检查是否在第一行。在Perl中$.是个特殊的变量,它匹配当前行。

· 第一个替换命令s先找到第一行的开头(^)然后插入<h1>标签。

· 第二个替换命令s搜寻行结尾($)再插入</h1>标签。

· 替换命令最后的m(多行)修饰符,表示将本行单独处理;这样,$就只匹配第一行的结尾而不会匹配整个文本的结尾。

· 最后在标准输出设备(屏幕)中打印出结果。

· 所有这些操作都是针对rime.txt文件的。

同样可以将这些命令放入程序文件中,比如示例代码库中的h1.pl文件。

#!/usr/bin/perl –n

if ($. == 1) {
s/^/<h1>/;
s/$/<\/h1>/m;
print;
}

然后在rime.txt的同一个目录下,执行如下命令:

perl h1.pl rime.txt

用Perl语言实现相同任务的方式很多,也许这不是为文本添加标记的最有效的方法。很可能本书上市后,我又会想出使用Perl(或其他工具)的更有效的方法。希望你也能够想到。

下一章我们将讨论边界和零宽度断言

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

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

发布评论

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