Java不愿意从量词的两边进行匹配

时间:2013-05-20 18:41:23

标签: java regex reluctant-quantifiers

我想在java中编写一个正则表达式,它将从量词的两边找到最短的可用匹配。

例如,对于此模式"a.*?b"适用于"aaaaaacbbbbbbb"

我想找到"acb",但我得到"aaaaaacb"

任何人都知道我可以使用哪种正则表达式?

2 个答案:

答案 0 :(得分:2)

您想要以'a'开头并以'b'结尾的最短序列。这意味着在初始'a'和最终'b'´, neither an'之间可能会出现'nor a'b'`(否则匹配中会包含更短的此类序列),因此< / p>

"a[^ab]*b"

会找到一个最小的序列(第一个出现在搜索的字符串中,或​​者所有这些,取决于你如何搜索)。

我不喜欢懒惰与贪婪匹配的语法,我认为

"a[^a]*?b"

会做同样的事情,匹配'a',非'a'的最小序列,直到找到下一个'b'

答案 1 :(得分:2)

你可以通过放弃贪婪的.*来模仿不情愿的匹配。在这种情况下,如果您获得组号1,这将变为.*(a.*?b)

String example = "aaaaaacbbbbbbb";
Matcher m = Pattern.compile(".*(a.*?b)").matcher(example);
m.find();
System.out.println(m.group(1));