2012-04-10 56 views
24

我想2個正則表達式組合成1 OR運算符:|使用正則表達式或運算解決2個條件

我有一個檢查一個字母后跟8位數字的匹配:

Regex.IsMatch(s, "^[A-Z]\d{8}$") 


我有另一種爲簡單的9位檢查:

Regex.IsMatch(s, "^\d{9}$") 


現在,而不是做的:

If Not Regex.IsMatch(s, "^[A-Z]\d{8}$") AndAlso 
    Not Regex.IsMatch(s, "^\d{9}$") Then 
    ... 
End If 


我想我可以簡單地做:

If Not Regex.IsMatch(s, "^[A-Z]\d{8}|\d{9}$") Then 
    ... 
End If 


顯然我沒有正確地結合兩者,顯然我在正則表達式太可怕了。任何幫助將非常感激。

對於那些想知道的,我確實看了一下How to combine 2 conditions and more in regex,我仍然在撓頭。

+0

另一種方式來寫它會很有幫助是'「^ [A-Z0-9] \ d {8} $」'(大寫字母或數字後跟8個數字)。雖然我沒有看到你的正則表達式有問題。你能提供一些應該/不應該匹配的字符串的例子嗎? – 2012-04-10 18:46:15

+0

@PatrickMcElhaney有效的條目應該是:A1234578或123456789 – 2012-04-10 18:47:32

+0

@Scott Patrick的建議同時支持這兩個問題,正如Mike C的回答如下,使用相同的正則表達式。 – 2012-04-10 18:49:11

回答

30

如何使用^[A-Z0-9]\d{8}$

+0

+1,比其他人效率更高。 – Griffin 2012-04-10 18:47:11

+4

非常感謝。我無法相信在我的修補過程中我沒有嘗試過。當我開始思考這個問題時,Regex讓我疲憊不堪,哈哈。 – 2012-04-10 18:56:29

11

我想你想組的條件:

Regex.IsMatch(s, "^(([A-Z]\d{8})|(\d{9}))$") 

^和$代表行的開頭和結尾,所以你不希望他們在或條件考慮做。在括號讓你成爲明確的關於「一切都在這個括號」或「任何在這個其他括號」

+0

當然,沒問題 – 2012-04-10 18:53:01

5

我找到OR操作有點怪異,有時還有,我做什麼,我使用組來表示我想這部分匹配,所以你的正則表達式會變成這樣的:^(([A-Z]\d{8})|(\d{9}))$

+0

@Scott:謝謝你的提示。我已經更新了我給出的答案。 – npinti 2012-04-10 19:22:46

48

|運算符具有高優先級,並且在原始正則表達式中將首先應用。你應該結合兩個正則表達式的w/grouping括號來使優先級清晰。如:

"^(([A-Z]\d{8})|(\d{9}))$" 
+0

只要對你​​的陳述的語義有所好奇:你是不是將分組圓括號作爲「運算符」?如果不是,它們是什麼? 「結構體? – 2012-04-10 19:57:32

+0

嗯,是的,你是對的 - 我的語言不夠準確。這是一種向人們解釋它的習慣 - 他們自然會接受,分組括號會覆蓋優先順序,然後再考慮所有其他運營商。但確切地說,這很好,所以我會澄清。 – 2012-04-10 20:44:58

+0

@CodeJockey我已經考慮寫更多,但你的答案提供了一個很好的總結這種情況下,沒有必要重複。 – 2012-04-10 21:05:42

9

@ MikeC的產品似乎是最好的:

^[A-Z0-9]\d{8}$ 

...但是,爲什麼你的表情是不是工作,你可能期望的方式,你必須明白,|「或「或」交替「運算符具有非常高的優先級 - 我相信唯一更高的是分組結構。如果你用你的例子:

^[A-Z]\d{8}|\d{9}$ 

...你基本上是說「匹配字符串開始,大寫字母,然後是8位數字或匹配9位數字然後結束字符串」 - 如果,而不是你的意思是「匹配字符串開頭,然後大寫字母后跟8位數字然後結束字符串或字符串後跟9位數字,然後字符串」結束的開始,那麼你想要的其中之一:

^([A-Z]\d{8}|\d{9})$ 
^[A-Z]\d{8}$|^\d{9}$ 

希望這是你的理解

+0

我在發帖之前曾嘗試過'^ [A-Z] \ d {8} $ |^\ d {9} $'在http://regexpal.com/,但它不適合我。奇怪的是,我回去嘗試了一遍,現在確實如此。然而,MikeC的答案完全沒有OR的需要。所以,對我來說這是最好的情況。努力和解釋+1。 – 2012-04-10 19:09:25

+0

@斯科特高興地幫助:) – 2012-04-10 19:11:29