java.util.Pattern 只匹配一个替代组?

标签 java regex

假设您有一个使用多个替代方案编译的 java.util.Pattern,每个替代方案都有一个捕获组:

Pattern pattern = Pattern.compile("(a?bc)|(ab?c)|(abc?)");
Matcher matcher = pattern.matcher("abc");
System.out.println(matcher.matches());
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));

你会看到:

true
abc
null
null

有没有办法让每个捕获组都匹配,或者您是否总是被限制为单个匹配组?

也就是说,由于“abc”与上面的每个替代项匹配,有什么方法可以将其作为输出:

true
abc
abc
abc

根据我对正则表达式实现的内存,我猜不会,但我想我应该检查一下。

最佳答案

使用交替,它只会填充多个组中的一组,但您可以使用前瞻来填充您想要的所有 3 个组:

(?=(a?bc))(?=(ab?c))(?=(abc?))

它将根据您的需要在所有 3 个组中填充 abc

RegEx Demo

Java Code Demo

更新:此外,您还需要使用 Matcher#find() 才能获得多个匹配项:

Pattern p = Pattern.compile("(?=(a?bc))(?=(ab?c))(?=(abc?))");
Matcher m = p.matcher("abc");
while (m.find()) {
   System.out.printf("%s::<%s> <%s> <%s>%n", m.group(), m.group(1), m.group(2), m.group(3));
}

关于java.util.Pattern 只匹配一个替代组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25511198/

相关文章:

java - 为什么CompletableFuture没有按顺序执行?

java - 单元测试私有(private)内部类方法

java - 为什么 Eclipse 控制台不显示日志范围结果

java - 如何配置 SonarQube 5.3 来调整使用哪些子模块/包来确定覆盖范围?

regex - 检查正则表达式子模式是否不包含先前的子模式?

python - 如何在 .hgignore 中模拟语言补码运算符?

java - 通过蓝牙在android 2.3中共享文件

javascript - 我如何突出显示 n 个序列字符串单词

java - 在正则表达式中使用命名组会导致 "Lookbehind doesn' t 有明显的最大长度“错误

表单的正则表达式模式匹配验证在 ant.design 中不起作用