正则表达式 - 从逗号分隔的圆括号内获取数据

时间:2013-04-05 07:27:19

标签: c# regex

我还在学习正则表达式,我是新手。

我有以下数据

add(2,3);

我想从括号'()'中获取整数值,同时获取由','分隔的以下整数的各个值,以作为变量存储在数组列表中

预期结果应该是

result[0] = 2;
result[1] = 3;

另一个样本数据是

add(2,3,1);

,结果如下

result[0] = 2;
result[1] = 3;
result[2] = 1;

我尝试使用下面的表达式'@“\ d +”'但是当我解析数据时它会读取字符串中的所有数字。我尝试过的另一个表达式是'((\ d \,\ d))'但它成功读取了第一个例子而不是第二个例子。

整个代码段

   string s = "add(2,3,1);";
   MatchCollection matches = Regex.Matches(s, @"\d+");

   string[] result = matches.Cast<Match>().Take(10).Select(match => match.Value).ToArray();

请告知。谢谢。

3 个答案:

答案 0 :(得分:0)

您可以考虑使用以下方法代替RegEx:

private IEnumerable<int> GetNumbers(string text)
{
    var textParts = text.Split(new []{'(',')'});
    if (textParts.Length != 3) return new int[0];
    return textParts[1].Split(',').Select(n => Convert.ToInt32(n.Trim()));
}

答案 1 :(得分:0)

我将使用命名组,并迭代组中的不同捕获,如下所示。我在测试字符串中添加了一些虚拟数字,以确保它们不被捕获:

string s = "12 3 4 142  add( 2 , 3,1 ); 21, 13 123 123,";
var matches = Regex.Matches(s, @"\(\s*(?<num>\d+)\s*(\,\s*(?<num>\d+)\s*)*\)");

foreach (Match match in matches)
    foreach (Capture cpt in match.Groups["num"].Captures)
        Console.WriteLine(cpt.Value);

要将捕获存储在数组中,可以使用以下LINQ语句:

var result = matches.Cast<Match>()
                    .SelectMany(m => m.Groups["num"].Captures.Cast<Capture>())
                    .Select(c => c.Value).ToArray();

答案 2 :(得分:0)

试试这个:

 string s = "add(2,3,1),4";

            MatchCollection matches = Regex.Matches(Regex.Matches(s, @"\(.*?\)").Cast<Match>().First().ToString(), @"\d+");
             string[] result = matches.Cast<Match>()
                                      .Take(10)
                                      .Select(match => match.Value)
                                      .ToArray();
  

结果[0] = 2;结果1 = 3;结果[2] = 1;

Demo