繁体   English   中英

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

[英]regex - optionally capture 2 groups

我有一个包含例如的字符串。 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. 分组两次:

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

  2. 提前使用

    在正则表达式中, "(?=[1-9][ab])([1-9]a)?([1-9]b)?" ,首先,积极的前瞻将确保接下来的两个组之一将匹配,然后两个组将有机会进行匹配。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM