代码之家  ›  专栏  ›  技术社区  ›  impossible

使用Pattern&Matcher[duplicate]索引所有重叠模式

  •  0
  • impossible  · 技术社区  · 6 年前

    如何获得模式匹配的字符串的所有索引(包括重叠)。 我有这个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]
    


    我们能用花样和火柴吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   tobias_k    6 年前

    您可以更改regex,以便整个表达式都在一个lookahead内,即更改 "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