如何获得模式匹配的字符串的所有索引(包括重叠)。 我有这个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]
我们能用花样和火柴吗?
您可以更改regex,以便整个表达式都在一个lookahead内,即更改 "aaa" 到 "(?=aaa)" 真正地 Online Demo ):
"aaa"
"(?=aaa)"
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