9.1 匹配标签

在开始对诗文进行匹配之前,先讨论一下如何匹配HTML或XML标签。有很多方式匹配标签,无论是起始标签(如)还是结束标签(如),但我找到一个比较可靠的方法。不论是否有属性,它都会匹配起始标签:

  1. <[_a-zA-Z][^>]*>

以下是该表达式的解析。

  • 第一个字符是左尖括号(<)。
  • 在XML中元素可以以下划线字符(_)开头,而在HTML中是以ASCII范围中的大写或小写字母开头(参见9.6节)。
  • 在起始字符之后,标签名称可以是零或多个除右尖括号(>)之外的任意字符。
  • 该表达式以右尖括号结尾。

请用grep尝试下面的命令。对代码库中的示例DITA文件lorem.dita进行匹配:

  1. grep -Eo '<[_a-zA-Z][^>]*>' lorem.dita

结果是:

  1. <topic id="lorem">
  2. <title>
  3. <body>
  4. <p>
  5. <p>
  6. <ul>
  7. <li>
  8. <li>
  9. <li>
  10. <p>
  11. <p>

要同时匹配起始标签和结束标签,只需添加一个斜线并在之后加一个问号即可。问号使斜线成为可选匹配部分:

  1. </?[_a-zA-Z][^>]*>

我只在这里讨论起始标签。为了让输入更美观,我常使用管道将结果传入其他工具程序:

  1. grep -Eo '<[_a-zA-Z][^>]*>' lorem.dita | sort | uniq | sed 's/^<//;s/ id=\".*\"//;s/>$//'

该命令列出了排序后的一串XML标签名:

  1. body
  2. li
  3. p
  4. p
  5. title
  6. topic
  7. ul

第10章也就是最后一章会更详细地讲解这些内容。接下来几节让我们温故知新。