9.1 匹配标签
在开始对诗文进行匹配之前,先讨论一下如何匹配HTML或XML标签。有很多方式匹配标签,无论是起始标签(如)还是结束标签(如
),但我找到一个比较可靠的方法。不论是否有属性,它都会匹配起始标签:
<[_a-zA-Z][^>]*>
以下是该表达式的解析。
- 第一个字符是左尖括号(
<
)。 - 在XML中元素可以以下划线字符(
_
)开头,而在HTML中是以ASCII范围中的大写或小写字母开头(参见9.6节)。 - 在起始字符之后,标签名称可以是零或多个除右尖括号(
>
)之外的任意字符。 - 该表达式以右尖括号结尾。
请用grep尝试下面的命令。对代码库中的示例DITA文件lorem.dita进行匹配:
grep -Eo '<[_a-zA-Z][^>]*>' lorem.dita
结果是:
<topic id="lorem">
<title>
<body>
<p>
<p>
<ul>
<li>
<li>
<li>
<p>
<p>
要同时匹配起始标签和结束标签,只需添加一个斜线并在之后加一个问号即可。问号使斜线成为可选匹配部分:
</?[_a-zA-Z][^>]*>
我只在这里讨论起始标签。为了让输入更美观,我常使用管道将结果传入其他工具程序:
grep -Eo '<[_a-zA-Z][^>]*>' lorem.dita | sort | uniq | sed 's/^<//;s/ id=\".*\"//;s/>$//'
该命令列出了排序后的一串XML标签名:
body
li
p
p
title
topic
ul
第10章也就是最后一章会更详细地讲解这些内容。接下来几节让我们温故知新。