Java-正则表达式-查找所有匹配项

时间:2018-08-16 04:23:35

标签: java regex

我需要Java正则表达式方面的帮助。

我的文字是这个abc abc abc xyz xyz xyz。 我需要找到在abcxyz

之间只有个词的所有匹配项

此处应返回两个匹配项:

  1. abc abc xyz ==> abcabc之间存在xyz
  2. abc xyz xyz ==> xyzabc之间存在xyz

我的正则表达式模式:

abc\s+([a-z]*?)\s+xyz

似乎只匹配第一个匹配项abc abc xyz。找不到abc xyz xyz

什么是适合所有人的正确模式?

4 个答案:

答案 0 :(得分:4)

如果您只需要一个单词而不是完全匹配as you stated in the comments,则可以使用正向Lookbehind和正向Lookahead,如下所示:

(?<=abc\s)[a-z]+(?=\sxyz)

这里是demo


如果您确实需要完全匹配,或者您希望在单词之前/之后有多个空格,则可能需要检查Andreas's answer

答案 1 :(得分:1)

也许在匹配时需要一些修改:

public static void main(String... args) {
    String s = "abc abc abc xyz xyz xyz";
    Pattern pattern = Pattern.compile("(abc\\s+\\w+\\s+xyz)");
    Matcher matcher = pattern.matcher(s);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
        s = s.substring(matcher.start() + 1); // ignore the just-matched and move on;
        matcher = pattern.matcher(s);
    }
}

输出:

abc abc xyz
abc xyz xyz

答案 2 :(得分:1)

这是一个可以处理多个空格的正则表达式,可以告诉您在哪里找到了完全匹配项,在哪里找到了单词本身,并且不需要重置Matcher即可继续搜索。

String input = "abc  abc  abc  xyz  xyz  xyz";

Pattern p = Pattern.compile("abc(?=(\\s+([a-z]+)\\s+xyz))");
for (Matcher m = p.matcher(input); m.find(); ) {
    String match = m.group() + m.group(1);
    String word = m.group(2);
    System.out.printf("%d-%d: %s%n", m.start(), m.end(1), match);
    System.out.printf("  %d-%d: %s%n", m.start(2), m.end(2), word);
}

输出

5-18: abc  abc  xyz
  10-13: abc
10-23: abc  xyz  xyz
  15-18: xyz

它的工作原理是仅直接匹配前导abc,然后将其余部分匹配为零宽度的正向超前,捕获整个超前匹配,因此可以构建“完整”匹配。这样,第二个搜索结果就可以与先前匹配的单词开始匹配。

为了获得额外的加分,它还捕获了单词本身。

然后,您可以选择是否要完全匹配,还是只想要单词。

答案 3 :(得分:-1)

您忘记了定界符并重复了内部元素。这是link for online demo

^abc\s+(?:([a-z]*?)\s+)+?xyz$

并使内部元素查找器不再贪婪