438

我需要有关与非贪婪选项匹配的正则表达式的帮助。

匹配模式是:

<img\s.*>

要匹配的文本是:

<html>
<img src="test">
abc
<img
  src="a" src='a' a=b>
</html>

我在http://regexpal.com上测试

<img此表达式匹配从到最后的所有文本>>我需要它与在 initial 之后遇到的第一个匹配<img,所以在这里我需要得到两个匹配而不是我得到的一个。

我尝试了所有non-greedy?的组合,但没有成功。

4

3 回答 3

616

非贪婪的?工作非常好。只是您需要在您正在测试的正则表达式引擎(regexpal,您使用的引擎,也有此选项)中选择点匹配所有选项。这是因为,当您使用. 您需要明确告诉他们您也想将换行符与..

例如,

<img\s.*?>

工作正常!

在此处检查结果

此外,请阅读dot在各种正则表达式中的行为方式。

于 2012-08-10T09:42:12.167 回答
119

操作数使?匹配非贪婪。例如.*,是贪婪的,而.*?不是贪婪的。所以你可以使用类似的东西<img.*?>来匹配整个标签。或<img[^>]*>

但请记住,整套 HTML 并不能真正用正则表达式解析。

于 2012-08-10T09:43:05.677 回答
24

这里的其他答案假定您有一个支持非贪婪匹配的正则表达式引擎,这是 Perl 5 中引入的扩展,并被广泛复制到其他现代语言;但它绝不是无处不在的。

许多旧的或更保守的语言和编辑器只支持传统的正则表达式,它们没有控制重复运算符的贪婪的机制*——它总是匹配尽可能长的字符串。

然后,诀窍是首先限制允许匹配的内容。而不是.*你似乎在寻找

[^>]*

它仍然匹配尽可能多的东西;但这个东西不仅仅是.“任何字符”,而是“任何不是的字符>”。

根据您的应用程序,您可能希望也可能不希望启用允许“任何字符”包含换行符的选项。

即使您的正则表达式引擎支持非贪婪匹配,最好还是说明您的实际意思。如果这就是您的意思,您可能应该这样说,而不是依赖非贪婪匹配(希望,可能)按我的意思行事。

例如,在通配符 like 后面带有尾随上下文的正则表达式将.*?><br/>跳过任何嵌套>,直到找到尾随上下文><br/>(此处为明确禁止换行符)显然不能也不会这样做。>[^>]*><br/>[^\n>]*><br/>

当然,如果你需要处理,这仍然不是你想要的<img title="quoted string with > in it" src="other attributes"> and perhaps <img title="nested tags">,但到那时,你应该最终放弃使用正则表达式,就像我们一开始就告诉你的那样。

于 2018-11-19T05:50:56.190 回答