有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我的文本是abc abc abc xyz xyz xyz。 我需要找到所有在abcxyz

以下是应返回的两个匹配项:

  1. abc abc xyz==>;在abcxyz之间存在abc
  2. abc xyz xyz==>;在abcxyz之间存在xyz

我的正则表达式模式:

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

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

什么样的模式适合所有人


共 (4) 个答案

  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. # 2 楼答案

    这是一个可以处理多个空格的正则表达式,它可以告诉您在哪里找到了完整的匹配项,在哪里找到了单词本身,并且不需要重置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. # 3 楼答案

    您忘记了分隔符并重复了内部元素。这是一个link for online demo

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

    让内在的元素不那么贪婪

  4. # 4 楼答案

    如果你只需要中间的一个单词,而不是完全匹配的as you stated in the comments,你可以使用积极的向后看和积极的向前看,如下所示:

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

    这是一个demo


    如果您确实需要完整匹配,或者希望在单词前后有多个空格,您可能需要选中Andreas's answer