单个表达式中的Alternation(|)和+的Java Regex行为

时间:2015-06-06 21:43:24

标签: java regex

有些人可以解释java regex的以下输出:(CASE 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组

Zeroth group: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组

Zeroth group:top

小组计数:1

发现:“编码员”为第1组

Zeroth group:coder

为什么CASE 1中的顶部不匹配? +如何影响交替的匹配(|)?

1 个答案:

答案 0 :(得分:2)

使用重复的捕获组时,即。因为量词,Matcher只会捕获最后一场比赛。

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

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

regex101中解释了这一点。