跳到主要内容

9.1 前后查找

我们先来看一下例子:你要把一个 Web 页面的标题提取出来。HTML 标题是出现在 "<title>" 和 "</title>" 标题之间的文本,而这对标签又必须嵌在 HTML 代码的 HEAD 部分里面。看下面这个例子:

<title>.*?</title>
在工具中查看
<head><title>何方的个人小站</title></head>

<title>.*?</title> 匹配 "<title>" 和 "</title>" 标签和其中间的文本。这个模式与我们预期基本相符,但不够理想。

为什么这么说呢?因为只有标题才是我们需要的,而我们找到的匹配里还包含着 "<title>" 和 "</title>" 本身。能不能只返回标题的文字部分呢?

办法之一是使用子表达式。我们可以利用子表达式把被匹配文本划分为 3 个部分:开始标签、标题文字和结束标签。把被匹配的文本划分为多个部分后,从它们当中提取且只提取出我们需要的部分就很容易了。

可是,明知是自己并不真正需要的东西(比如上例中的 "<title>" 和 "</title>" 标签),还把它们检索出来岂不是毫无意义。“先想办法把它们检索出来、再以手动方式排除它们”这既浪费时间,又容易招致不必要的后患。在遇到这类问题的时候,你真正需要的是这样一个模式,它包含的匹配本身并不返回,而是用于确定正确的匹配位置,它并不是匹配结果的一部分。换句话说,你需要进行“前后查找”。

注意

本章将对向前查找和向后查找都进行讨论。常见的正则表达式实现都是支持前者,但支持后者的就没那么多了。

Java、.NET、PHP 和 Perl 都支持向后查找(但有一些限制),Javascript 和 ColdFusion 不支持向后查找。

该内容基于 《正则表达式必知必会》 二度创作
转载请遵守原作者相关协议并注明本页地址
https://iamhefang.cn/tutorials/正则表达式/第九章-前后查找/9.1-前后查找