如何在Java中获取重叠的正则表达式匹配?

3
例如,使用该模式:
[a-z]{2}

在字符串bcd中,唯一的匹配项是[bc]。相反,我想得到[bc, cd]


2
注意:目前没有一种方法(据我所知)可以获取所有可以从相同索引开始的匹配项。例如,对于字符串aaa和正则表达式a*,在索引0处可能有4个匹配项。Marko Topolnik的答案涵盖了您想要在每个索引处最多获取1个匹配项的情况。 - nhahtdh
2个回答

2

重复使用Matcher.find(int start)Matcher.start(),以找出下一个要查找的字符串索引。

String haystack="bcd";
Matcher m = pattern.matcher(haystack);
int lookIndex=0;
while(lookIndex < haystack.length() && m.find(lookIndex)) {
    lookIndex=m.start()+1;
    System.out.println("Found " + m.group());
}

这确实是一种解决方案,但当模式可以匹配空字符串时,您必须小心... - nhahtdh
现在已进行了调整,以避免OutOfBoundsException。同时还成功地测试了其模式匹配空字符串的功能。 - escitalopram

2
您可以使用涉及捕获组的前瞻来实现此操作:
(?=([a-z]{2})).

您需要一个循环,其中涉及Matcher.find并且每次使用group(1)查询匹配器以获取您的匹配项。主要正则表达式匹配本身是无关紧要的,应该被忽略。

你为什么需要前瞻?句末的 . 不会防止匹配只包含最后一个字符的情况吗? - escitalopram
“而且,句末的点号不会防止只由最后一个字符组成的匹配吗?” 不会。但它确实可以防止空匹配(如果我们使用可以匹配空字符串的模式)。预查是一种简洁的方法来解决这个问题,你不必关心边界情况。 - nhahtdh
@escitalopram 我还没有尝试过这个,所以我保守地在那里加了一个点。我认为整个程序即使没有点也能正常工作。 - Marko Topolnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接