非贪婪的比赛不起作用

时间:2014-01-14 13:02:13

标签: java regex

我有一个像这样的字符串

<tag1>
    <tag1>
        any text
    </tag1>
    text
</tag1>

我希望找到一个<tag1>,其中包含此字符串中的最短文本。

我使用了以下正则表达式<tag1>.*?</tag1>,而不是<tag1>any text</tag1>我得到<tag1> <tag1>any text</tag1>。这是example

为什么它不起作用,我做错了什么?

3 个答案:

答案 0 :(得分:1)

您可以使用此简单代码来解决您的具体问题:

<tag1>[^<]*</tag1>

答案 1 :(得分:0)

如果这些标签没有嵌套在自己内部(相同的标签),我将能够帮到你。

使用正则表达式执行此类操作通常是个坏主意。你应该得到一个合适的解析器来满足你的要求。

答案 2 :(得分:0)

它不起作用,因为它会在第一个<tag1>开始匹配,然后尽可能匹配,因此在第一个</tag1>结束,从而产生“<tag1> <tag1>any text</tag1>”。

您可以使用否定的character class

来避免匹配代码
<tag1>[^<>]*</tag1>

See it on Regexr

另一种可能性是使用否定的lookahead assertion并仅匹配下一个字符,如果它不是标记。

(<tag1>)((?!\1).)*?</tag1>

See it on Regexr