2013-11-15 59 views
1

我有以下正則表達式類

^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)*) 

這個正則表達式將只接受

0x12 0x34 0xA2 

0x12, 0x34 

我使用這樣應該拒絕,

if(true != Regex.IsMatch(inputData, @"^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)*)")) 
{ 
Console.WriteLine("error"); 
} 

但即使我給0x12, 0x34或任何字符串,它總是給予真實。 有人可以解決這個問題嗎?謝謝

+1

什麼它應該接受什麼和應該失敗之間的區別?失敗是接受的一個子集?! – Liam

回答

1

你應該結束與$正則表達式。如果沒有,它將匹配逗號前的數字並返回true。應該是這樣的:

^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)*)$ 

如果你不想匹配的空行,改變最終*+

^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)+)$ 

另外,如果你不使用的組可以降括號中的大多數:

^(\s*0[xX][0-9a-fA-F]{2}\s*)+$ 
4

你錯過了在正則表達式的結束$字符。 $字符匹配字符串或行的結尾。目前,它正在檢查字符串是否以零或多個指定長度的十六進制字符串開頭。任何字符串都將以字符串的至少0個實例開始,因此所有字符串當前都匹配。

正則表達式應該看起來像^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)*)$

或者,如果您希望它至少以其中一個十六進制字符串開頭,則應該將最後一個*字符替換爲+,該字符將匹配一個或多個實例。

該正則表達式看起來像^(((\s*0[xX]([0-9a-fA-F]{2}))\s*)+)$

最後,如果您希望字符串被空格分隔,則需要對其進行更多修改。這兩個正則表達式都會允許連續的字符串在兩者之間沒有空格。我有一種感覺,「正確」的正則表達式會變得相當醜陋,所以你最好在空間上使用String.Split,忽略空行,在每個字符串上運行正則表達式^0[xX]([0-9a-fA-F]{2})$

+0

你提到的正則表達式可以匹配空行,我也不希望OP想要 –

+0

@ T.V。我已經添加了另一個應該匹配一個或多個實例的正則表達式,儘管我現在已經注意到兩個正則表達式都會接受多個十六進制字符串,而它們之間沒有空白。 –