非贪婪匹配不起作用



>我有这样的字符串

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

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

我使用了以下正则表达式<tag1>.*?</tag1>,但不是<tag1>any text</tag1>而是<tag1> <tag1>any text</tag1>.下面是示例。

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

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

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

它不起作用,因为它会在第一个<tag1>开始匹配,然后尽可能少地匹配,所以在第一个</tag1>结束,导致" <tag1> <tag1>any text</tag1> "。

可以通过使用否定字符类来避免匹配标记

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

在正则表达式上看到它。

另一种可能性是使用否定的前瞻断言,如果下一个字符不是标记,则仅匹配下一个字符。

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

在正则表达式上看到它

如果这些标签没有嵌套在它们自己(同一个标签)中,我将能够帮助你。

使用正则表达式做这种事情通常是一个坏主意。您应该获得合适的解析器来满足您的要求。

最新更新