正则表达式获取包含一个单词而不是另一个单词的多行标签

对于多行文本,我必须将所有包含文本(狗)但不包含其他文本(猫)的<img>标记替换为

有这样的文字:

<img black 
dog>
<img dog white cat>
<img black dog>
<img cat and dog>
<img red fox>
<img black dog>

应找到以下文本:

正则表达式获取包含一个单词而不是另一个单词的多行标签

有很多方法可以使用^$来为单行正则表达式找到它,但是我不能使用多行来做到这一点。

我的第一次尝试是以这种方式使用单行选项(/s

/<img ((?!cat).)*?(dog)>/gs

但是它选择的是最后一条狗(赤狐)之前的标签,因为它不够贪婪。

正则表达式获取包含一个单词而不是另一个单词的多行标签

然后我使用?使它没有设置/s的贪婪(添加\s\S):

/<img ((?!cat)[\s\S.])*?(dog)?>/g

即使没有狗,我也会再次找到第五个标签(<img red fox>)。

正则表达式获取包含一个单词而不是另一个单词的多行标签

如何挑选3只没有猫或狐狸的狗?

链接到我在regex101中的尝试:https://regex101.com/r/AGgb4z/1

wen463500 回答:正则表达式获取包含一个单词而不是另一个单词的多行标签

您可以匹配<img,然后使用否定的cat断言没有(?![^<>]*cat)

使用negated character class [^<>]*匹配狗左右两侧的<>以外的任何字符。

如果猫和狗不应该是较长单词的一部分,则可以使用单词边界,例如\bcat\b

<img (?![^<>]*cat)[^<>]*dog[^<>]*>

Regex demo

本文链接:https://www.f2er.com/2945552.html

大家都在问