2012-11-09 22 views
-1

我想匹配主要,次要版本,修訂版本和內部版本號。正則表達式匹配文件版本

我的問題是:

給出2個版本

string Version1 = "01.01.02.44"; 
string Version2 = "01.01.02.FF1"; 
string pattern [email protected]"\d+.\d+.\d+.\d+"; 
var regEx = new Regex(pattern, RegexOptions.IgnoreCase); 
var versionMatch = regEx.Match(Version2); 
      if (match.Success) 
      { 
       // DO ... 
      } 

使用下面的正則表達式:

string pattern [email protected]"\d+.\d+.\d+.\d+"; 

我可以匹配版本1 ...

但我怎麼會讓它匹配Version2?

+3

您需要提供更多示例。解釋有效和無效版本號的規則。 – Oded

回答

4

您需要檢查在您的版本號中是否有效的字符,而不僅僅是數字。例如,下面的正則表達式匹配兩種:

string pattern [email protected]"\d+\.\d+\.\d+\.[0-9F]+"; 

這在假設前三部分都是純數字,而最後一個可以是任何數字或字母F.你只修改字符類的匹配適合您的精確要求(我們不知道)。

+2

糟糕。這會教會我複製和粘貼OPs的東西,只是修改顯而易見的錯誤。將更新。 ;-) – Chris

+0

@JanDvorak:這是真的,但仍然沒有任何藉口。 :) – Chris

+0

@已接受。 –

0

那是因爲你只是在尋找整數0-9而不是字母

可以拆分刺成多個組,請使用。*?讓所有的字符,而不是隻有[0-9]

@"(?s)\.(?<string>.*?)\.(?<string>.*?)\.(?<string>.*?)\.(?<string>.*?)" 
+0

您已成功複製OP的錯誤;-) –

+0

我編輯了我的帖子 – Greezer

3

最簡單的方法是拆就.

string[] parts = versionNumber.Split('.'); 
if (parts.Length != 4) 
{ 
    // Invalid revision number. 
} 
else 
{ 
    string major = parts[0]; 
    string minor = parts[1]; 
    string revision = parts[2]; 
    string buildNumber = parts[3]; 
    // etc... 
} 
+0

當然,如果OP試圖獲取版本的各個部分。我不認爲是這樣。 – Oded

2

爲什麼使用字符串操作來處理版本號?

我推薦使用System.Version類。

該類已經管理的一個版本的所有部件(構建主要MajorRevisionMinorRevision修訂)。

您可以輕鬆地比較版本號,不僅是一場比賽,更要檢查,如果版本號是比另一個更舊或更新:

Version v1 = new Version(2, 0); 
Version v2 = new Version("2.1"); 

Console.Write("Version {0} is ", v1); 

switch(v1.CompareTo(v2)) 
{ 
    case 0: 
     Console.Write("the same as"); 
     break; 
    case 1: 
     Console.Write("later than"); 
     break; 
    case -1: 
     Console.Write("earlier than"); 
     break; 
} 

Console.WriteLine(" Version {0}.", v2); 

在這個MSDN article約System.Version用於看一看更多細節和例子。

該類將爲您節省使用字符串操作處理版本號不同部分的開銷。

0

爲了捕捉你提到你可以改變兩個字符串:

string pattern [email protected]"\d+.\d+.\d+.\d+"; 

到:

string pattern [email protected]"\d\d[.]\d\d[.]\d\d[.]...|\d\d[.]\d\d[.]\d\d[.].."; 

這將是很好的爲你瞭解一點正則表達式是如何工作的,雖然也許測試的幾個情景了。然後你可以調整模式以符合你的確切需求。

如果你想在yuor模式下捕捉一個點(。),你必須把它放在方括號中,因爲它被用作保留字符。加號(+)表示前一個字符的任意數字,因此\ d +將匹配任意數量的數字(01和0123以及567789等)。

請參閱regex cheat sheet

如果你想測試你的正則表達式,你可以這樣做online