我需要有关与非贪婪选项匹配的正则表达式的帮助。
匹配模式是:
<img\s.*>
要匹配的文本是:
<html>
<img src="test">
abc
<img
src="a" src='a' a=b>
</html>
<img
此表达式匹配从到最后的所有文本>
。>
我需要它与在 initial 之后遇到的第一个匹配<img
,所以在这里我需要得到两个匹配而不是我得到的一个。
我尝试了所有non-greedy?
的组合,但没有成功。
我需要有关与非贪婪选项匹配的正则表达式的帮助。
匹配模式是:
<img\s.*>
要匹配的文本是:
<html>
<img src="test">
abc
<img
src="a" src='a' a=b>
</html>
<img
此表达式匹配从到最后的所有文本>
。>
我需要它与在 initial 之后遇到的第一个匹配<img
,所以在这里我需要得到两个匹配而不是我得到的一个。
我尝试了所有non-greedy?
的组合,但没有成功。
操作数使?
匹配非贪婪。例如.*
,是贪婪的,而.*?
不是贪婪的。所以你可以使用类似的东西<img.*?>
来匹配整个标签。或<img[^>]*>
。
但请记住,整套 HTML 并不能真正用正则表达式解析。
这里的其他答案假定您有一个支持非贪婪匹配的正则表达式引擎,这是 Perl 5 中引入的扩展,并被广泛复制到其他现代语言;但它绝不是无处不在的。
许多旧的或更保守的语言和编辑器只支持传统的正则表达式,它们没有控制重复运算符的贪婪的机制*
——它总是匹配尽可能长的字符串。
然后,诀窍是首先限制允许匹配的内容。而不是.*
你似乎在寻找
[^>]*
它仍然匹配尽可能多的东西;但这个东西不仅仅是.
“任何字符”,而是“任何不是的字符>
”。
根据您的应用程序,您可能希望也可能不希望启用允许“任何字符”包含换行符的选项。
即使您的正则表达式引擎支持非贪婪匹配,最好还是说明您的实际意思。如果这就是您的意思,您可能应该这样说,而不是依赖非贪婪匹配(希望,可能)按我的意思行事。
例如,在通配符 like 后面带有尾随上下文的正则表达式将.*?><br/>
跳过任何嵌套>
,直到找到尾随上下文><br/>
(此处为明确禁止换行符)显然不能也不会这样做。>
[^>]*><br/>
[^\n>]*><br/>
当然,如果你需要处理,这仍然不是你想要的<img title="quoted string with > in it" src="other attributes"> and perhaps <img title="nested tags">
,但到那时,你应该最终放弃使用正则表达式,就像我们一开始就告诉你的那样。