【问题标题】:Unexpected match with java regex [duplicate]与java正则表达式意外匹配[重复]
【发布时间】:2013-08-13 14:01:33
【问题描述】:

我想在文本中找到 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 数据。但这不是重点。

【问题讨论】:

标签: java regex non-greedy


【解决方案1】:

.*? 量词意味着它将找到尽可能少的字符来满足匹配,这并不意味着它将在找到的第一个 &gt; 处停止搜索。所以在你的例子中,&lt;x.*?&gt; 将匹配所有:

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

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

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

顺便说一句,之前已经说过很多次了,但是you should not use regular expressions to parse xml/html/xhtml

【讨论】:

  • 感谢您的回答和提示。我知道正则表达式不是用于 xml 处理的正确工具,但有时 - 如果您必须对大量文件进行小修复 - 快速文本替换很诱人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多