java - 正则表达式 - 可选择捕获 2 组

标签 java regex

我有一个包含例如的字符串。 1a2b。数字为 1 至 9,字母 (a|b) 为常数。我想要一个查找“1a”和“2b”的正则表达式,其中任一组都是可选的。

我有这个...

    String description = "bla bla bla: 1a2b more bla bla bla";
    Pattern pattern = Pattern.compile("([1-9]a)([1-9]b)");
    Matcher matcher = pattern.matcher(description);
    if (matcher.find()) {
        System.out.println(" group1: " + matcher.group(1));
        System.out.println(" group2: " + matcher.group(2));
    } else {
        System.out.println("no match");
    }

输出

group1: 1a
group2: 2b

如果我在任一组之后添加 ? 它仍然有效。如果我在 BOTH 之后添加 ? 它仍然匹配,但对两个组都返回 null。

如何使这两个组都是可选的,以便它匹配

情况 1:“bla 1a bla”

案例 2:“bla 2b bla”

情况 3:“bla 1a2b bla” ?

最佳答案

我发现有两种可能的方法:

  1. 一组进行两次:

    如果您使用 "([1-9]a)([1-9]b)?|([1-9]b)",它将匹配您想要的内容,但是您必须检查第 2 组和第 3 组才能找到带有 b 的部分。

  2. 使用前瞻

    在正则表达式 "(?=[1-9][ab])([1-9]a)?([1-9]b)?" 中,首先是正向前瞻将确保以下两个组之一匹配,然后这两个组就有匹配的机会。

解决方案 1 更便携(并非所有正则表达式引擎都支持前瞻),并且可能稍快一些(并且对于大多数人来说更容易理解),但需要更改组的使用方式(您必须检查组 2(或组 1)是否为 null 并在这种情况下使用组 3。

关于java - 正则表达式 - 可选择捕获 2 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34028158/

相关文章:

java - Apache 点燃数据流

Python正则表达式多次匹配

javascript - 为什么 string.replace(/\W*/g ,'_' ) 在所有字符前加上?

java - 主题之间的过滤

java.util.ArrayList 循环遍历循环内的其余元素

Java 多线程不清楚

regex - AS3 : RegExp exec method in loop problem

regex - 检查 URL 时更改正则表达式以允许 IP 地址?

c# - 在 StringBuilder 上替换 Regex 的最佳方法是什么?

Java Math.IEEERemainder 令人困惑的结果