单个表达式中交替 (|) 和 + 的 Java 正则表达式行为

标签 java regex

可以解释一下 java 正则表达式的以下输出:(案例 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

第 0 组:topcoder

其中以下代码:(CASE 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 组

第 0 组:顶部

组数:1

发现:“编码器”作为组 1

第 0 组:编码器

为什么 CASE 1 中没有 top 的匹配项? + 如何影响交替 (|) 的匹配?

最佳答案

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

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

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

这在 regex101 中有解释。 .

关于单个表达式中交替 (|) 和 + 的 Java 正则表达式行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30687865/

相关文章:

regex - Incrontab 不处理 IF 语句

java - 具有多个调用者方法的堆栈跟踪

Java:字符串对象矩阵

java - Graphics2D 旋转方法。有什么不同?

Javascript 正则表达式和方括号

Javascript 正则表达式 : Want to exclude function words in all caps

java - 如何允许用户使用不同的参数运行 Docker 应用程序

java - RestTemplate 异常在测试 Spring boot 应用程序时未找到转换器

regex - 在 Notepad++ 中,使用正则表达式替换除与给定表达式匹配的行之外的所有行

regex - 具有负前瞻的递归正则表达式