可以解释一下Java regex的以下输出:(案例1)

   String s = "topcoder is "

            String p = "(top|coder)+";
            Pattern pttrn = Pattern.compile(p);
            Matcher m = pttrn.matcher(s);
            while(m.find()){
                System.out.println("group count: " + m.groupCount());
                for (int i = 1; i <= m.groupCount(); i++) {
                    System.out.println("Found : \"" + m.group(i) + "\" as group " + i);
                }
                System.out.println("Zeroth group:" + m.group(0));
            }


产生以下输出:

小组人数:1

找到:“编码器”作为组1

零组:topcoder

其中以下代码:(案例2)

        String s = "topcoder is ";
        String p = "(top|coder)";
        Pattern pttrn = Pattern.compile(p);
        Matcher m = pttrn.matcher(s);
        while(m.find()){
            System.out.println("group count: " + m.groupCount());
            for (int i = 1; i <= m.groupCount(); i++) {
                System.out.println("Found : \"" + m.group(i) + "\" as group " + i);
            }
            System.out.println("Zeroth group:" + m.group(0));
        }


产生以下输出:

小组人数:1

找到:“ top”作为组1

第零组:顶部

小组人数:1

找到:“编码器”作为组1

零组:编码器

为什么在案例1中没有最高匹配? +如何影响交替(|)的匹配?

最佳答案

使用重复的捕获组时,即由于存在量词,Matcher将仅捕获最后一个匹配项。

您可以将整个重复的捕获组包装在其自己的捕获组中,以提取每个匹配项

String p = "((top|coder)+)";


regex101中对此进行了说明。

08-07 12:06