2015-12-01 62 views
0

我有一個字符串包含例如。 1a2b。數字是1到9,字母(a | b)是常數。我想要一個正則表達式來查找'1a'和'2b',其中任何一個組都是可選的。正則表達式 - 可選地捕獲2組

我有這個...

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: 「喇嘛1A喇嘛」

案例2: 「喇嘛2B喇嘛」

案例3:「喇嘛1a2b bla「 ?

+0

你試過嗎?''' –

+1

只是一個簡單的問題:爲什麼不使用'([1-9]?)([ab])'?你說(a)和(b)是恆定的,所以只有這個數字可以不存在 –

+0

一,其他或兩者:'([1-9] a)|([1-9] b)|([1- 9] a)([1-9] b)' – Shloim

回答

1

我覺得那樣做有兩種可能的方式:

  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組。

+1

謝謝。1.爲我工作,我會接受這個答案如果沒有其他人可以在沒有管道的情況下提供答案。 – TedTrippin

+0

@TedTrippin這是沒有管道的,這是合乎邏輯的OR –

+1

在維基百科上搜索「豎線」。 – TedTrippin