1

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

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

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

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

4

2 回答 2

2

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

"a[^ab]*b"

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

我认为我不熟悉惰性匹配与贪婪匹配的语法

"a[^a]*?b"

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

于 2013-05-20T18:47:26.650 回答
2

您可以通过丢弃 greedy 来从一开始就模仿不情愿的匹配.*。在这种情况下,.*(a.*?b)如果您获得组号 1,这将变为 :

String example = "aaaaaacbbbbbbb";
Matcher m = Pattern.compile(".*(a.*?b)").matcher(example);
m.find();
System.out.println(m.group(1));
于 2013-05-20T18:51:35.150 回答