使用拆分提取重叠匹配

时间:2012-12-26 18:46:29

标签: java regex split

如何使用String.split()从输入中提取重叠匹配?

例如,如果尝试查找与"aba"匹配的内容:

String input = "abababa";
String[] parts = input.split(???);

预期产出:

[aba, aba, aba]

3 个答案:

答案 0 :(得分:5)

String#split不会给你重叠的匹配。因为字符串的特定部分只会包含在获得的数组的唯一索引中,而不会包含在两个索引中。

您应该在此处使用PatternMatcher课程。 你可以使用这个正则表达式: -

Pattern pattern = Pattern.compile("(?=(aba))");

使用Matcher#find方法获取所有重叠的匹配项,并为其打印group(1)

上面的正则表达式匹配每个空字符串,后跟aba,然后只打印第一个捕获的组。现在look-ahead零宽度断言,所以它不会消​​耗匹配的字符串。因此,您将获得所有重叠的匹配。

String input = "abababa";
String patternToFind = "aba";

Pattern pattern = Pattern.compile("(?=" + patternToFind + ")");
Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
    System.out.println(patternToFind + " found at index: " + matcher.start());
}

输出: -

aba found at index: 0
aba found at index: 2
aba found at index: 4

答案 1 :(得分:3)

我会使用indexOf。

for(int i = text.indexOf(find); i >= 0; i = text.indexOf(find, i + 1))
   System.out.println(find + " found at " + i);

答案 2 :(得分:0)

这不是split()的正确用法。来自javadocs

  

将此字符串拆分为给定正则表达式的匹配项。

在我看来,您并不是要分割字符串,而是要在字符串中查找正则表达式的所有匹配项。为此,您必须使用Matcher和一些在Matcher上循环的额外代码来查找所有匹配项,然后创建数组。