Regex.GetGroupNumbersメソッドおよびRegex.GetGroupNamesメソッドを使用すると、正規表現内で定義されているグループ番号・グループ名の一覧を取得することができます。 このメソッドはインスタンスメソッドであるため、インスタンス化された正規表現に対してのみ使用できます。

GetGroupNumbersメソッドでは、正規表現内のすべてのグループの番号が返されます。 このメソッドでは、グループが名前付きグループかどうかに関わらず割り当てられているグループ番号が返されます。

GetGroupNamesメソッドでは、正規表現内のグループが名前付きグループの場合はその名前、そうでない場合は文字列形式のグループ番号が返されます。

どちらのメソッドの場合も、正規表現内にグループがあるかないかに関わらず、マッチ全体を表すグループ番号``0``が常に結果に含まれます。

Regex.GetGroupNumbers/GetGroupNamesメソッドで正規表現内で定義されているすべてのグループ番号/グループ名を取得する
using System;
using System.Text.RegularExpressions;

class Sample {
  static void Main()
  {
    var pattern = @"(?<year>\d{4})-(?<month>\d{2})-(\d{2})"; // yyyy-mm-dd

    // GetGroupNumbers/GetGroupNamesメソッドはインスタンスメソッドであるため、
    // インスタンス化された正規表現に対してのみ使用できる
    var re = new Regex(pattern);

    // GetGroupNumbersメソッドで正規表現内のグループ番号を取得する
    Console.WriteLine("group numbers: {0}", string.Join(", ", re.GetGroupNumbers()));

    // GetGroupNamesメソッドで正規表現内のグループ名を取得する
    // (名前付きグループの場合はその名前、そうでない場合は文字列形式のグループ番号が返される)
    Console.WriteLine("group names: {0}", string.Join(", ", re.GetGroupNames()));
  }
}
実行結果
group numbers: 0, 1, 2, 3
group names: 0, 1, year, month

Regex.GroupNameFromNumber/GroupNumberFromNameメソッドを使うと、グループ番号に対応するグループ名、またその逆対応を取得することをできます。