我同意@Dav 的观点,你最好在每个方括号组上使用 String.Split 。
但是,您可以使用单个正则表达式提取所有数据:
(?:\s*\[((.*?)(?:,(.+?))*)\])+
使用此表达式,您将必须处理所有captures http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.group.captures.aspx每个group http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.group.aspx获取所有数据。例如,在字符串上运行以下代码:
var regex = new Regex(@"(?:\s*\[((.*?)(?:,(.+?))*)\])+");
var match = regex.Match(@"[1,2,3,4,5] [abc,ef,g] [0,2,4b,y7]");
for (var i = 1; i < match.Groups.Count; i++)
{
var group = match.Groups[i];
Console.WriteLine("Group " + i);
for (var j = 0; j < group.Captures.Count; j++)
{
var capture = group.Captures[j];
Console.WriteLine(" Capture " + j + ": " + capture.Value
+ " at " + capture.Index);
}
}
这会产生以下输出:
Group 1
Capture 0: 1,2,3,4,5 at 1
Capture 1: abc,ef,g at 13
Capture 2: 0,2,4b,y7 at 24
Group 2
Capture 0: 1 at 1
Capture 1: abc at 13
Capture 2: 0 at 24
Group 3
Capture 0: 2 at 3
Capture 1: 3 at 5
Capture 2: 4 at 7
Capture 3: 5 at 9
Capture 4: ef at 17
Capture 5: g at 20
Capture 6: 2 at 26
Capture 7: 4b at 28
Capture 8: y7 at 31
第 1 组为您提供每个方括号组的值,第 2 组为您提供每个方括号组中匹配的第一个项目,第 3 组为您提供所有后续项目。您必须查看捕获的索引以确定哪个项目属于每个方括号组。