2012-02-29 104 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); 
}