我想在
的文本中找到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数据的方法有很多种。但这不是重点。
答案 0 :(得分:5)
.*?
量词意味着它会找到尽可能少的字符来满足匹配,但这并不意味着它会在它找到的第一个>
处停止搜索。因此,在您的示例中,<x.*?>
将匹配以下所有内容:
<x>ipsum <x>dolor sit amet</x>
第一个x
和最终>
之间的所有字符都满足.*?
。要解决此问题,您只需将模式更改为:
<x[^>]*> +</x>
在旁注中,之前曾多次说过,但是you should not use regular expressions to parse xml/html/xhtml。