Match・Group・Captureと、実際にマッチする部分をツリー形式で表すと次のようになります。 カッコ内は入力文字列中におけるマッチした部分のインデックスとその長さです。
Match・Group・Captureの各内容をツリー形式で表示する
using System;
using System.Text.RegularExpressions;
class Sample {
static void Main()
{
var text = @"xcopy C:\test D:\target\backup\files";
var pattern = @"([A-Z]:)(\\[^\\ ]+)+";
Console.WriteLine("Regex: {0}", pattern);
Console.WriteLine("Input: {0}", text);
Console.WriteLine();
PrintMatch(Regex.Matches(text, pattern));
}
static void PrintMatch(MatchCollection matches)
{
for (var i = 0; i < matches.Count; i++) {
Match m = matches[i];
Console.WriteLine("Match[{0}] {1,-25} ({2}+{3})", i, m.Value, m.Index, m.Length);
PrintGroup(m.Groups);
Console.WriteLine();
}
}
static void PrintGroup(GroupCollection groups)
{
for (var i = 0; i < groups.Count; i++) {
Group g = groups[i];
Console.WriteLine(" Group[{0}] {1,-25} ({2}+{3})", i, g.Value, g.Index, g.Length);
PrintCapture(g.Captures);
}
}
static void PrintCapture(CaptureCollection captures)
{
for (var i = 0; i < captures.Count; i++) {
Capture c = captures[i];
Console.WriteLine(" Capture[{0}] {1,-25} ({2}+{3})", i, c.Value, c.Index, c.Length);
}
}
}
実行結果
Regex: ([A-Z]:)(\\[^\\ ]+)+ Input: xcopy C:\test D:\target\backup\files Match[0] C:\test (6+7) Group[0] C:\test (6+7) Capture[0] C:\test (6+7) Group[1] C: (6+2) Capture[0] C: (6+2) Group[2] \test (8+5) Capture[0] \test (8+5) Match[1] D:\target\backup\files (14+22) Group[0] D:\target\backup\files (14+22) Capture[0] D:\target\backup\files (14+22) Group[1] D: (14+2) Capture[0] D: (14+2) Group[2] \files (30+6) Capture[0] \target (16+7) Capture[1] \backup (23+7) Capture[2] \files (30+6)