如何获取模式匹配的字符串的所有索引(包括重叠)。 我有这个POC码。
public static void main(){
String input = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
Pattern pattern = Pattern.compile("aaa");
Matcher matcher = pattern.matcher(input);
List<Integer> all = new ArrayList<>();
while (matcher.find()) {
all.add(matcher.start());
}
System.out.println(all);
}
输出:
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
它不考虑重叠模式。 所有匹配的索引应为:
[0, 1, 2, 3, 4, .....27]
我知道KMP可以轻松实现,但是
我们可以使用模式和匹配器吗?
答案 0 :(得分:0)
您可以更改正则表达式,以使整个表达式都处于前瞻性之内,即将"aaa"
更改为"(?=aaa)"
。这样,匹配器将发现重叠的匹配项,尽管匹配项没有真正重叠,因为实际匹配项为空。但是,您仍然可以在前瞻中使用组。作为更复杂的示例(Online Demo):
String input = "abab1ab2ab3bcaab4ab5ab6";
Pattern pattern = Pattern.compile("(?=((?:ab.){2}))");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.start() + " " + matcher.group(1));
}
起始索引和组为:
2 ab1ab2
5 ab2ab3
14 ab4ab5
17 ab5ab6