我还在学习正则表达式,我是新手。
我有以下数据
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();
请告知。谢谢。
答案 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)