模式(含註解,需 RegexOptions.IgnorePatternWhitespace):
string pattern = @"
( # 群組 1 開始
abra # 匹配 abra
( # 群組 2 開始
cad # 匹配 cad
)? # 群組 2 結束(可選)
) # 群組 1 結束
+ # 重複一次以上
";
輸入:abracadabra1abracadabra2abracadabra3
Regex r = new Regex(pattern, RegexOptions.IgnorePatternWhitespace);
int[] groupNums = r.GetGroupNumbers();
Match m = r.Match(text);
while (m.Success) {
for (int i = 1; i < groupNums.Length; i++) {
Group g = m.Groups[groupNums[i]];
Console.WriteLine($"Group{groupNums[i]}=[{g.Value}]");
for (int j = 0; j < g.Captures.Count; j++) {
Capture c = g.Captures[j];
Console.WriteLine($" Capture{j}=[{c.Value}] Index={c.Index} Length={c.Length}");
}
}
m = m.NextMatch();
}
Group1=[abra] // 最後一次匹配值
Capture0=[abracad] Index=0 Length=7 // 第一次重複捕獲
Capture1=[abra] Index=7 Length=4 // 第二次重複捕獲
Group2=[cad] // 內層群組最後值
Capture0=[cad] Index=4 Length=3
// 後續重複相同結構...
重點:
+ 量詞產生多個 CaptureGroup.Value 永遠等於最後一個 Capture.Value+,僅匹配一次,CaptureCollection 僅含單一元素