2012-04-16 55 views
1

我想在同一個正則表達式中匹配多個輸入以捕獲下面的數字。
如果輸入不匹配第一組,那麼我有問題,因爲所有先前的捕獲組仍然捕獲,儘管它不匹配它們組。我相信我需要使用lookaround聲明,但我不熟悉這些聲明。正則表達式捕獲組流入第二個匹配集

樣品輸入:

wordA 123456 
wordA: 123456 
wordA : 123456 
wordA R123465 
wordA: R123456 
wordA : R123456 
wordB R123465 

WordA同時具有可選:R。到目前爲止,我有這樣的:/(?:wordA :?R?(\d+)|wordB R(\d+))/i
使用的最後一個樣本輸入提供了這樣的結果:

array 
    0 => string 'wordB R123456' (length=13) 
    1 => string '' (length=0) 
    2 => string '123456' (length=6) 

通緝的結果是:

array 
    0 => string 'wordB R123465' (length=13) 
    1 => string '123456' (length=6) 

任何想法如何解決?

回答

3

問題是您的交替

/(?:wordA :?R?(\d+)|wordB R(\d+))/i 
       ^^^^^  ^^^^^ 
      Group 1  Group 2 

因此,如果您正則表達式的第二替代匹配,則結果將是在第2組(array[2])和第一組將是空的。

改成這樣

(?:wordA :?R?|wordB R)(\d+) 

看到它here on Regexr

然後你的電話號碼將永遠是第一組中(因爲只有一個)

+0

謝謝。我知道這是因爲有兩組,但我想如果第一部分不匹配,那麼其餘部分將被忽略。這是一個錯誤的假設。 – Kim 2012-04-16 13:55:44

1

您定義兩個捕獲組,因此你會得到兩個結果。正則表達式的實現並不在乎它們每次只能匹配其中的一個。您可以將您的表情重寫爲

/(?:wordA :?R?|wordB R)(\d+)/i 

避免定義兩個捕獲組。請注意,:?R?不足以將您的測試案例與_:_:_相匹配。 爲了得到這些,你可以使用

/(?:wordA ?:? R?|wordB R)(\d+)/i 
相關問題