如何编写与非贪心匹配的正则表达式?

2024-03-28 20:21:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

匹配模式为:

<img\s.*>

要匹配的文本是:

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

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

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

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


Tags: test文本srccomhttpimg表达式html
3条回答

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

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

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

[^>]*

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

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

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

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

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

非贪婪的?工作得非常好。只是您需要选择regex引擎中的dot matches all选项(regexpal,您使用的引擎,也有这个选项)来测试。这是因为,当您使用.时,正则表达式引擎通常不匹配换行符。您需要明确地告诉他们,您还想用.匹配换行符

例如

<img\s.*?>

很好用!

检查results here

另外,阅读各种regex口味的how dot behaves

操作数?使match不贪婪。E、 g..*是贪婪的,而.*?不是贪婪的。因此可以使用类似<img.*?>的东西来匹配整个标记。或者<img[^>]*>

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

相关问题 更多 >