我如何编写一个与非贪婪相匹配的正则表达式?

时间:2012-08-10 09:37:41

标签: regex regex-greedy non-greedy

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

匹配模式是:

<img\s.*>

要匹配的文字是:

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

我在http://regexpal.com

上进行测试

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

我尝试了非贪婪? 的所有组合,但没有成功。

3 个答案:

答案 0 :(得分:391)

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

匹配

例如,

<img\s.*?>

工作正常!

检查results here

另外,请阅读各种正则表达式中的how dot behaves

答案 1 :(得分:63)

?操作数使得匹配非贪婪。例如。 .*是贪婪的,而.*?则不是。因此,您可以使用<img.*?>之类的内容来匹配整个标记。或<img[^>]*>

但请记住,整套HTML无法使用正则表达式进行实际解析。

答案 2 :(得分:0)

这里的其他答案都以您有一个支持非贪婪匹配的正则表达式引擎为基础,该引擎是Perl 5中引入的扩展,已广泛复制到其他现代语言中。但这绝不是普遍存在的。

许多较旧的语言和编辑器仅支持传统的正则表达式,而传统的正则表达式没有控制重复操作符*的贪婪性的机制-它始终与最长的字符串匹配。

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

[^>]*

仍然与尽可能多的 something 相匹配;但是某物不仅是.“任何字符”,而是“不是>的任何字符”。

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

即使您的正则表达式引擎支持非贪婪匹配,也最好阐明您的实际意思。如果您的意思是 ,那么您可能应该这样说,而不是依靠非贪婪的匹配来(希望是,可能)做到我的意思。

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