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

匹配模式为:

<img\s.*>

要匹配的文本是:

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

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

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

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


不贪婪?工作得很好。只是您需要选择您正在测试的regex引擎中的所有选项(regexpal,您使用的引擎也有这个选项)。这是因为,正则表达式引擎通常不匹配换行符当你使用..您需要显式地告诉它们您也想匹配换行符。

例如,

<img\s.*?>

没问题!

点击这里查看结果。

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


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

但是请记住,实际上不能用正则表达式解析整个HTML集。


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

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

接下来的技巧是首先限制允许匹配的内容。而不是。*你似乎在寻找

[^>]*

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

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

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

例如,一个正则表达式的通配符后面有一个尾随上下文,比如。*?><br/>将跳过任何嵌套>,直到它找到后面的上下文(这里,><br/>),即使这需要跨越多个>实例和换行符,如果你允许的话,[^>]*><br/>(甚至[^\n>]*><br/>,如果你必须显式禁止换行)显然不能也不会这样做。

当然,这仍然不是你想要的,如果你需要处理<img title="带引号的字符串与>在它" src="其他属性">和也许<img title="嵌套标签">,但在这一点上,你应该最终放弃使用正则表达式,就像我们都告诉你在第一个地方。