Вот еще один вариант, который использует CaptureCollections (единственный способ сделать это в одном регулярном выражении). Там, где ответ Фила Росса делает все это в одной операции сопоставления, этот выполняет несколько сопоставлений. Таким образом, все захваты отдельных предметов правильно группируются в соответствии с парами скобок, в которых они были найдены.
string s = @"[1,2,3,4,5] [abc,ef,g] [0,2,4b,y7] ";
Regex r = new Regex(@"\[((?:([^,\[\]]+),?)*)\]");
int matchNum = 0;
foreach (Match m in r.Matches(s))
{
Console.WriteLine("Match {0}, Group 1: {1}", ++matchNum, m.Groups[1]);
int captureNum = 0;
foreach (Capture c in m.Groups[2].Captures)
{
Console.WriteLine(" Group 2, Capture {0}: {1}", ++captureNum, c);
}
}
выход:
Match 1, Group 1: 1,2,3,4,5
Group 2, Capture 1: 1
Group 2, Capture 2: 2
Group 2, Capture 3: 3
Group 2, Capture 4: 4
Group 2, Capture 5: 5
Match 2, Group 1: abc,ef,g
Group 2, Capture 1: abc
Group 2, Capture 2: ef
Group 2, Capture 3: g
Match 3, Group 1: 0,2,4b,y7
Group 2, Capture 1: 0
Group 2, Capture 2: 2
Group 2, Capture 3: 4b
Group 2, Capture 4: y7