正则表达式解析问题

时间:2012-02-29 10:18:58

标签: c# regex parsing

我需要解析下面的字符串,并希望使用正则表达式,但可以找到正确的方法。

输入样本(令牌分隔符为;,令牌内部为任意字符,即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};

感谢您的帮助。

3 个答案:

答案 0 :(得分: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));
    }
}

答案 1 :(得分:1)

更具限制性的正则表达式可能是:

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

输出第1组和第2组:

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);
}

答案 2 :(得分: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);
}