wencaizhang

正则表达式的贪婪模式

Published onMarch 15, 2024
-Views
3Minutes Read
遇到一个需求: 现在有一段 HTML 字符串, 需要拿到这里面所有的 img 标签的 src 属性.
HTML 字符串如下(已经过简化):
为了匹配 img 标签的 src 属性, 我使用的正则是
, 匹配结果如下:
匹配 src 属性之贪婪模式
如图所示, 并没有按照期待中的匹配每个 src 属性值, 反而仅匹配到最后一个 src, 而且还多余匹配了几个字符. 图中使用的工具是匹配 src 属性之贪婪模式 - regex101, 您可以狠狠点击打开查看本示例.
经过多方查询(实际主要是问了 ChatGPT), 才知道这是因为正则默认是贪婪匹配模式导致的.

什么是贪婪匹配

顾名思义, "贪婪"就是尽可能多的匹配符合条件的字符. 举个例子 🌰, 现在有一个字符串
, 正则是
, 你认为
会匹配哪些字符呢? 是
还是
呢?
答案是
, 实际两个答案都符合正则匹配, 但是因为"贪婪"的缘故, 所以最后匹配到的结果是"最多"的那个, 也就是
.
例子之贪婪模式
如何匹配最少那个呢? 那就要使用"非贪婪模式"了. 将刚才的正则改为
就是非贪婪模式了, 这样就是只匹配第一次出现的
了.
例子之非贪婪模式
这两个例子也都可以点击查看:

贪婪匹配和非贪婪匹配的规则

正则匹配时,如果遇到下面这些标识符,代表是贪婪匹配,会尽可能多的去匹配内容:
与之对应的非贪婪匹配标识符如下:
可以看到,非贪婪模式的标识符其实就是在贪婪模式的标识符后面加上一个

最终代码

因此只需要将一开始匹配 src 属性的正则改为非贪婪模式即可:
匹配 src 属性之非贪婪模式
结果和预期相同, 匹配到了全部的 src 属性, 您可以点击查看: 匹配 src 属性之非贪婪模式 - regex101
最后完整代码如下:

Reference

Tags:
#正则