2012-02-29 139 views
1

我需要解析下面的字符串,並且想要使用正則表達式,但可以找到正確的方式來完成它。正則表達式解析問題

輸入採樣(令牌分離器是;和令牌內是任何字符即,M/W/d)

1W4;2W35;4M35;13W108 

預期輸出

List<string> points = new List<string>() {"1W", "2W", "4M", "13W"}; 
List<int> intervals = new List<int>() {4, 35, 35, 108}; 

感謝您的幫助。

+0

你不需要使用正則表達式來分割你只能用'String.Split'功能 嘗試以下代碼行: 列表點= mystring.Split(';')。ToList (); – 2012-02-29 10:29:33

回答

7

你可以只用string.Split分割你的令牌的字符串,然後使用正則表達式解析每個令牌:

var exp = new Regex(@"^(?<point>\d+[a-zA-Z])(?<interval>\d+)$"); 
var str = "1W4;2W35;4M35;13W108"; 
var tokens = str.Split(new char[] {';'}, StringSplitOptions.RemoveEmptyEntries); 
foreach (var token in tokens) 
{ 
    var match = exp.Match(token); 
    if (match != null) 
    { 
     points.Add(match.Groups["point"].Value); 
     intervals.Add(int.Parse(match.Groups["interval"].Value)); 
    } 
} 
+0

如果您傳遞字符串「1W4; 2W35; 4M35; 13W108;」注意最後一個字符中的逗號,你會得到強制異常。我添加了一個支票 if(match!= null &&!string.IsNullOrEmpty(match.Value)) – UshaP 2012-03-01 09:06:37

+1

@UshaP,在這種情況下最好使用'str.Split(new char [] {';'},StringSplitOptions。 RemoveEmptyEntries)'通過使用另一個[string.Split](http://msdn.microsoft.com/en-us/library/ms131448.aspx)重載。 – Alex 2012-03-01 10:35:59

1

更嚴格的正則表達式可能是:

var regEx = new Regex("^([0-9]+[MWD])([0-9]+)$"); 

隨着第1組和2 youre輸出:

var regEx = new Regex("^([0-9]+[MWD])([0-9]+)$"); 
var str = "1W4;2W35;4M35;13W108"; 
var vals = str.Split(';'); 
foreach (var v in vals) 
{ 
    var match = regEx.Match(v); 
    Console.WriteLine(match.Groups[1].Value); 
    Console.WriteLine(match.Groups[2].Value); 
} 
0

這是一個相當自由的正則表達式,因爲它將容忍在輸入中的差異(例如,它並不關心;):

var points = new List<string>(); 
var intervals = new List<string>(); 

foreach (Match match in Regex.Matches(input, @"(\d+[MWD])(\d+)")) 
{ 
    points.Add(match.Groups[1].Value); 
    intervals.Add(match.Groups[2].Value); 
}