正则表达式模式不会在第一次出现时停止

时间:2016-10-01 23:50:48

标签: regex

我有以下正则表达式。

/<img.+src=['"](?P<src>.+?)['"].*>/i

但是当我在任何包含多个图像的字符串上运行它时,它将返回最后一个图像。事实上,无论是否是图像,它都会返回最后一次src发生。

这是因为它从<img选择到最后一个下一个换行符,而不是停留在标记的最后>

如何更改我的正则表达式以停留在>标记的<img>

看一下这个例子

https://regex101.com/r/QNQA72/2

2 个答案:

答案 0 :(得分:3)

.*更改为.*?,将.+更改为.+?

  • .* greedy ,与很多匹配
  • .*? 不情愿,其匹配为 little

同样适用于+版本。

答案 1 :(得分:0)

完全回答你的最后一个问题

  

如何更改我的正则表达式以停止在&gt;标签

您可能只需将.+变为[^>]+

/<img[^>]+src=['"](?P<src>.+?)['"].*>/i

但它不是一个非常好的解决方案,因为它会使正则表达式引擎运行起来。

更好的解决方案是分两步完成,首先选择整个<img>元素,然后在里面查找src
因此,如果您想在src中显示每个string

var images = string.match(/<img[^>]+>/ig);
for (img of images) {
    var match = img.match(/src=(["|'])([^'"]*)\1/);
    if (match) { // (avoid error when <img> doesn't contain src)
        console.log(match[2]);
    }
}

请注意我们如何查找src="..."src='...',按(["|'])捕获开头报价,然后使用反向引用确保结束报价相同。