在Java中查找正则表达式模式的所有匹配项 - 甚至是重叠项

时间:2018-03-09 15:33:58

标签: java regex

我有一个String形式:

  

1,2,3,4,5,6,7,8,...

我正在尝试查找此字符串中包含4位数字的所有子字符串。为此,我有正则表达式[0-9],[0-9],[0-9],[0-9]。不幸的是,当我尝试将正则表达式与我的String匹配时,我从未获得所有子串,只是所有可能子串的一部分。例如,在上面的示例中,我只会得到:

  

1,2,3,4

     

-5,6,7,8-

虽然我希望得到:

  

1,2,3,4

     

-2,3,4,5-

     

-3,4,5,6-

     

...

我如何找到与我的正则表达式相对应的所有匹配?

有关信息,我使用PatternMatcher查找匹配项:

Pattern pattern = Pattern.compile([0-9],[0-9],[0-9],[0-9]);
Matcher matcher = pattern.matcher(myString);

List<String> matches = new ArrayList<String>();

while (matcher.find())
{
  matches.add(matcher.group());
}

4 个答案:

答案 0 :(得分:4)

默认情况下,对Matcher.find()的连续调用从上一场比赛的结束开始。

要从特定位置查找,请将一个字符的起始位置参数传递给前一个find开头后的一个字符的find

在你的情况下可能是这样的:

while (matcher.find(matcher.start()+1))

这很好用:

Pattern p = Pattern.compile("[0-9],[0-9],[0-9],[0-9]");

public void test(String[] args) throws Exception {
    String test = "0,1,2,3,4,5,6,7,8,9";
    Matcher m = p.matcher(test);
    if(m.find()) {
        do {
            System.out.println(m.group());
        } while(m.find(m.start()+1));
    }
}

印刷

  

0,1,2,3

     

1,2,3,4

     

...

答案 1 :(得分:2)

如果您正在寻找纯正的基于正则表达式的解决方案,那么您可以使用这个基于前瞻性的正则表达式来重叠匹配:

(?=((?:[0-9],){3}[0-9]))

请注意,您的匹配在捕获的组#1中可用

RegEx Demo

<强>代码:

    final String regex = "(?=((?:[0-9],){3}[0-9]))";
    final String string = "0,1,2,3,4,5,6,7,8,9";

    final Pattern pattern = Pattern.compile(regex);
    final Matcher matcher = pattern.matcher(string);

    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }

Code Demo

<强>输出:

0,1,2,3
1,2,3,4
2,3,4,5
3,4,5,6
4,5,6,7
5,6,7,8
6,7,8,9

答案 2 :(得分:1)

一些没有正则表达式的示例代码(因为它对我来说似乎没用)。此外,我认为正则表达式在这种情况下会变慢。然而,只要数字长度仅为1个字符,它才能正常工作。

String s = "a,b,c,d,e,f,g,h";
for (int i = 0; i < s.length() - 8; i+=2) {
    System.out.println(s.substring(i, i + 7));
}

此字符串的输出:

a,b,c,d
b,c,d,e
c,d,e,f
d,e,f,g

答案 3 :(得分:1)

正如@OldCurmudgeon指出的那样,find()默认情况下从上一场比赛结束开始。要在第一个匹配元素之后定位它,将第一个匹配区域作为捕获组引入,并使用它的结束索引:

Pattern pattern = Pattern.compile("(\\d,)\\d,\\d,\\d");
Matcher matcher = pattern.matcher("1,2,3,4,5,6,7,8,9");
List<String> matches = new ArrayList<>();
int start = 0;
while (matcher.find(start)) {
    start = matcher.end(1);
    matches.add(matcher.group());
}
System.out.println(matches);

结果

[1,2,3,4, 2,3,4,5, 3,4,5,6, 4,5,6,7, 5,6,7,8, 6,7,8,9]

如果匹配区域长于一位数

,此方法也可以使用