2013-06-21 118 views
0

我試圖用正則表達式在C#中以匹配可包含軟件版本號:C#正則表達式匹配方括號

  • 一個2位數
  • 1或2位數字(在0未開始)
  • 另一個1或2位數字(在0未開始)
  • 一個1,2,3,4或5位數字(在0未開始)
  • 在一個選項信結尾用方括號括起來。

一些例子:

 
10.1.23.26812 
83.33.7.5 
10.1.23.26812[d] 
83.33.7.5[q] 

無效的例子:

 
10.1.23.26812[ 
83.33.7.5] 
10.1.23.26812[d 
83.33.7.5q 

我曾嘗試以下:

string rex = @"[0-9][0-9][.][1-9]([0-9])?[.][1-9]([0-9])?[.][1-9]([0-9])?([0-9])?([0-9])?([0-9])?([[][a-zA-Z][]])?"; 

(注:如果我試圖不帶 「@」並通過執行「\ [」來避開方括號「」我收到一條錯誤,提示「無法識別的急速pe序列「)

我可以達到版本號正確驗證的地步,但它接受任何後面的內容(例如:」10.1.23.26812這個應該是錯誤的「被匹配爲正確的)。

所以我的問題是:是否有使用正則表達式匹配/檢查方括號中的字符串方式或者我需要將其轉換爲不同的字符(如:改變[A]到一個並匹配* s代替)?

+0

這是匹配整個字符串還是在句子中間的這個版本號? –

回答

2

發生這種情況是因爲正則表達式匹配部分字符串,並且您沒有告訴它強制整個字符串匹配。此外,您還可以簡化您正則表達式很多(例如,你不需要那些所有capturing groups

string rex = @"^[0-9]{2}\.[1-9][0-9]?\.[1-9][0-9]?\.[1-9][0-9]{0,4}(?:\[[a-zA-Z]\])?$"; 

^$anchors匹配字符串的開始和結束是

的你提到的錯誤信息與事實有關,如果你不使用逐字字符串,你也需要避開反斜線。所以一個正則表達式可以在正則表達式中匹配爲"[[]""\\["@"\["。形式是優選的。

0

您需要錨定的正則表達式與^$

string rex = @"^[0-9][0-9][.][1-9]([0-9])?[.][1-9]([0-9])?[.][1-9]([0-9])?([0-9])?([0-9])?([0-9])?([[][a-zA-Z][]])?$"; 

10.1.23.26812thisShouldBeWrong比賽的原因是因爲它的子10.1.23.26812

正則表達式可以稍微的可讀性simplfied匹配

string rex = @"^\d{2}\.([1-9]\d?\.){2}[1-9]\d{0,4}(\[[a-zA-Z]\])?$"; 

迴應TimCross警告 - 更新正則表達式

string rex = @"^[0-9]{2}\.([1-9][0-9]?\.){2}[1-9][0-9]{0,4}(\[[a-zA-Z]\])?$"; 
+0

在.NET中,小心使用'\ d'等價於'\ p {Nd}',因此也會匹配'「123」'和其他數字,除非使用'RegexOptions.ECMAScript'編譯正則表達式。 –