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

时间:2015-12-01 19:08:42

标签: 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

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

如何使两个组都可选,以便匹配

案例1:" bla 1a bla"

案例2:" bla 2b bla"

案例3:" bla 1a2b bla" ?

1 个答案:

答案 0 :(得分:1)

我看到两种可能的方法:

  1. 有两个小组:

    如果您使用"([1-9]a)([1-9]b)?|([1-9]b)",它会匹配您想要的内容,但您必须同时检查第2组和第3组,以找到包含b的部分。

  2. 使用前瞻

    在正则表达式"(?=[1-9][ab])([1-9]a)?([1-9]b)?"中,首先一个正面的预测将确保以下两个组中的一个匹配,然后两个组获得匹配的机会。

  3. 解决方案1更具可移植性(并非所有正则表达式引擎都支持前瞻)并且可能稍微更快(并且更容易理解),但需要更改使用组(您必须检查组2(或组1))是null,在这种情况下使用第3组。