1

假设我有一个标签<tag>,我想匹配<tag>...<tag>我的字符串中的组。我可以使用正则表达式<tag>.*<tag>。这匹配<tag>foo<tag>,这很好,但它也匹配<tag>foo<tag>bar<tag>,这是我不想要的行为。我希望<tag>foo<tag>匹配,然后bar被排除,然后最后的标签成为下一个匹配的开始。我该怎么做呢?

4

2 回答 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 回答