假设我有一个标签<tag>
,我想匹配<tag>...<tag>
我的字符串中的组。我可以使用正则表达式<tag>.*<tag>
。这匹配<tag>foo<tag>
,这很好,但它也匹配<tag>foo<tag>bar<tag>
,这是我不想要的行为。我希望<tag>foo<tag>
匹配,然后bar
被排除,然后最后的标签成为下一个匹配的开始。我该怎么做呢?
问问题
574 次
2 回答
6
最简单的解决方案是使用惰性量词,其中?
强制.*
匹配尽可能少的字符(而不是尽可能多,因为朴素的.*
人会尝试匹配):
<tag>.*?<tag>
更安全、更明确的解决方案是使用否定的前瞻断言:
<tag>(?:(?!<tag>).)*<tag>
虽然在当前情况下,行为没有区别,但第二个可扩展以处理打开/关闭标签,确保嵌套标签不会错误匹配:
<tag>(?:(?!</?tag>).)*</tag>
当应用于<tag>foo<tag>bar</tag>baz</tag>
将匹配时<tag>bar</tag>
,而不是<tag>foo<tag>bar</tag>
作为具有惰性量词的解决方案。
于 2013-10-06T15:44:54.617 回答
2
你使用了一个懒惰的版本.*
:
<tag>.*?<tag>
^
使比赛一直到 的第一场?
比赛。.*
<tag>
于 2013-10-06T15:44:14.427 回答