例如,我有以下正则表达式:\d{2}
(2位数)。当我使用
Matcher matcher = Pattern.compile("\\d{2}").matcher("123");
matcher.find();
String result = matcher.group();
在结果变量中,我只获得第一个条目,即12
。但我希望得到所有可能的条目,即12
和23
。
如何实现这一目标?
答案 0 :(得分:6)
你需要积极前瞻的捕获小组的帮助:
Matcher m = Pattern.compile("(?=(\\d{2}))").matcher("1234");
while (m.find()) System.out.println(m.group(1));
打印
12
23
34
答案 1 :(得分:1)
这不是正则表达式匹配的工作方式。匹配器从字符串的开头开始,每次找到匹配时,它会继续从该匹配的 end 后面的字符中查找 - 它不会给你重叠的匹配。
如果要查找任意正则表达式的重叠匹配而无需使用前瞻和捕获组,可以通过在每次匹配后重置匹配器的“区域”来执行此操作
Matcher matcher = Pattern.compile(theRegex).matcher(str);
// prevent ^ and $ from matching the beginning/end of the region when this is
// smaller than the whole string
matcher.useAnchoringBounds(false);
// allow lookaheads/behinds to look outside the current region
matcher.useTransparentBounds(true);
while(matcher.find()) {
System.out.println(matcher.group());
if(matcher.start() < str.length()) {
// start looking again from the character after the _start_ of the previous
// match, instead of the character following the _end_ of the match
matcher.region(matcher.start() + 1, str.length());
}
}
答案 2 :(得分:0)