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

Poi*_*ull 315 regex non-greedy regex-greedy

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

匹配模式是:

<img\s.*>
Run Code Online (Sandbox Code Playgroud)

要匹配的文字是:

<html>
<img src="test">
abc
<img
  src="a" src='a' a=b>
</html>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pav*_*ath 438

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

例如,

<img\s.*?>
Run Code Online (Sandbox Code Playgroud)

工作良好!

这里查看结果.

此外,阅读关于如何表现在不同的正则表达式的口味.

  • 还有一个技巧可以解决这个问题:因为\ s表示"任何空格",而"\ S"表示"任何非空格",[\ s\S]将匹配任何字符(如"."). ,但包括新线)!同样,您可以使用[\ d\D]或[\ w\W].这可能是一个非常方便的小"黑客",它肯定是一个非常有用的技巧需要注意. (29认同)
  • 或者甚至,在这个例子中,您可以使用:`<img rel="nofollow noreferrer" [^>]*>`来实现相同的效果:因为"除了`>`之外的任何字符都包含新行! (7认同)
  • 很好的答案,但是 bash 怎么样?回声“&lt;img src=test&gt;bla&lt;img src=a&gt;”| grep -P '&lt;img\s.*?&gt;' 匹配整个字符串,尽管有 ? 操作员。 (2认同)

Ily*_*lya 71

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

但请记住,整个HTML集实际上无法使用正则表达式进行解析.

  • 您的回答提醒您:http://stackoverflow.com/a/1732454/431 (6认同)
  • 我认为更清楚地说`*?`是`*`的非贪婪版本. (6认同)

tri*_*eee 6

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

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

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

[^>]*
Run Code Online (Sandbox Code Playgroud)

仍然匹配尽可能多的东西;但是这些东西不仅是.“任何字符”,还包括“不是”的任何字符>

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

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

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

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


归档时间:

查看次数:

308176 次

最近记录:

5 年,10 月 前