2010-10-24 91 views
56

我有一個正則表達式,我認爲工作正常,直到現在。我需要匹配一個可選角色。它可能在那裏,也可能不在。正則表達式如何匹配一個可選字符

這裏有兩個字符串。頂部的字符串是匹配的,而下部的則不匹配。在較低的字符串中沒有單個字母是導致它失敗的原因。

我想在開始的5位數字之後得到單個字母,如果不存在,則繼續獲取字符串的其餘部分。這封信可以是A-Z

如果我從正則表達式中刪除([A-Z]{1}) +.*? +,它將匹配除信件外所需的所有內容,但它很重要。

20000  K    Q511195DREWBT   E00078748521 
30000      K601220PLOPOH   Z00054878524 

這是我正在使用的正則表達式。

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/ 

回答

112

使用

[A-Z]? 

,使信可選。 {1}是多餘的。 (當然,你也可以寫[A-Z]{0,1}這意味着相同的,但是這是?是有什麼。)

你可以提高你的正則表達式來

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2}) 

而且,因爲在大多數的正則表達式方言,\d相同[0-9]

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2}) 

但是:你真的需要11個獨立的捕獲組?如果是這樣,爲什麼不捕獲倒數第四組數字?

+0

Tim,我真的不確定,因爲我沒有寫這個正則表達式。對於正則表達式我還是很新的。如果你看到更好的寫作方式,我願意接受建議。 – jim 2010-10-24 06:45:37

+0

蒂姆,你的例子適用於兩個字符串,不管我在那個位置是否有一個字母。謝謝。 – jim 2010-10-24 07:00:51

13

可以使單個字母可選通過後加入?爲:

([A-Z]{1}?) 

的量詞{1}是多餘的,因此您可以將其刪除。

+0

感謝codeaddict。問號代替了「+。*」嗎? +'? – jim 2010-10-24 06:43:57

+0

使用grep正則表達式時,如果放棄{1}(grep:lookbehind斷言不是固定長度),將會出現錯誤。所以這是一個讓它進入的情況。 – Zunderscore 2017-07-26 09:35:04

3

你必須標記單個字母爲可選太:

([A-Z]{1})? +.*? + 

或使整個部分可選

(([A-Z]{1}) +.*? +)? 
+0

Stefan,我想讓這封信完全可選。我嘗試了這兩個,但它仍然沒有匹配。我確信我錯了。你可以修改你的例子,將它包含到字符串中嗎? – jim 2010-10-24 06:51:23