使用模式和匹配器的所有重叠模式的索引

时间:2018-08-16 10:51:28

标签: java pattern-matching

如何获取模式匹配的字符串的所有索引(包括重叠)。 我有这个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可以轻松实现,但是
我们可以使用模式和匹配器吗?

1 个答案:

答案 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