与java正则表达式意外匹配

时间:2013-08-13 14:01:33

标签: java regex non-greedy

我想在

的文本中找到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数据的方法有很多种。但这不是重点。

1 个答案:

答案 0 :(得分:5)

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

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

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

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

在旁注中,之前曾多次说过,但是you should not use regular expressions to parse xml/html/xhtml