1

我想在文本中找到 x 类型的 xml 标签

  • 为空(仅包含空格)
  • 可能有也可能没有属性

也是这样的

<x>  </x>
<x a="v">  </x>

我将以下正则表达式与 Matcher 查找函数结合使用。

<x.*?> +</x>

我得到了我没想到的比赛。请参阅以下测试用例

@Test
public void sample() throws Exception
{
    String text = "Lorem <x>ipsum <x>dolor sit amet</x> </x>";
    String regex = "<x.*?> +</x>";

    Matcher matcher = Pattern.compile(regex).matcher(text);
    assertFalse(matcher.find());
}

测试失败。相反,这是真的

assertTrue(matcher.find());
assertEquals("<x>ipsum <x>dolor sit amet</x> </x>", matcher.group());

find 函数是否不支持非贪婪运算符或这里出了什么问题?

PS 我知道有很多不同的方法来处理 xml 数据。但这不是重点。

4

1 回答 1

5

.*?量词意味着它会找到尽可能少的字符来满足匹配,这并不意味着它会在找到第一个字符时停止搜索>。因此,在您的示例中,<x.*?>将匹配所有:

<x>ipsum <x>dolor sit amet</x>

x第一个和最后一个之间的所有字符都>满足.*?. 要解决此问题,您只需将模式更改为:

<x[^>]*> +</x>

附带说明,之前已经多次说明,但您不应该使用正则表达式来解析 xml/html/xhtml

于 2013-08-13T14:04:01.950 回答