簡體   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