【问题标题】:Indices of all the overlapping patterns using Pattern & Matcher [duplicate]使用 Pattern 和 Matcher 的所有重叠模式的索引 [重复]
【发布时间】:2018-08-16 10:51:27
【问题描述】:

如何获取模式匹配的字符串的所有索引(包括重叠)。 我有这个 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 很容易做到这一点,但是
我们可以使用 Pattern 和 Matcher 做到这一点吗?

【问题讨论】:

    标签: java pattern-matching


    【解决方案1】:

    您可以更改您的正则表达式,以便整个表达式在前瞻内,即将"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
    

    【讨论】:

    • 哇。谢谢@tobias_k。有更多学习和试验正则表达式的好资源吗?
    • @impossible 有一些在线正则表达式测试器非常适合进行实验,因为它们通常还会提供正则表达式部分的详细分解。请参阅我更新的答案中的链接。
    • 这很有帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多