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

存在しないグループ番号・グループ名を指定した場合、GroupNameFromNumberメソッドは空の文字列("")、GroupNumberFromNameメソッドは-1を返します。 GroupNumberFromNameメソッドは、文字列化したグループ番号をグループ名として指定することもできます。 このとき、名前付きグループでない場合はそのグループに対応するグループ番号が返され、名前付きのグループの場合は対応するグループが存在する場合でも-1が返されます。

Regex.GroupNameFromNumber/GroupNumberFromNameメソッドで正規表現内で定義されているグループ番号/グループ名の対応を取得する
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);

    // GroupNameFromNumberメソッドで正規表現内のグループ名に対応するグループ番号を取得する
    Console.WriteLine("0 => '{0}'", re.GroupNameFromNumber(0));
    Console.WriteLine("1 => '{0}'", re.GroupNameFromNumber(1));
    Console.WriteLine("2 => '{0}'", re.GroupNameFromNumber(2));
    Console.WriteLine("3 => '{0}'", re.GroupNameFromNumber(3));
    Console.WriteLine("4 => '{0}'", re.GroupNameFromNumber(4)); // 存在しないグループ番号の場合は空の文字列が返される
    Console.WriteLine();

    // GroupNumberFromNameメソッドで正規表現内のグループ名に対応するグループ番号を取得する
    Console.WriteLine("year => {0}", re.GroupNumberFromName("year"));
    Console.WriteLine("month => {0}", re.GroupNumberFromName("month"));
    Console.WriteLine("0 => {0}", re.GroupNumberFromName("0")); // グループ番号を指定した場合、それが名前付きグループでなければ対応するグループ番号が返される
    Console.WriteLine("1 => {0}", re.GroupNumberFromName("1"));
    Console.WriteLine("2 => {0}", re.GroupNumberFromName("2")); // 名前付きグループのグループ番号を指定した場合、対応するグループが存在する場合でも-1が返される
    Console.WriteLine("non-existent => {0}", re.GroupNumberFromName("non-existent")); // 存在しないグループ名の場合は-1が返される
  }
}
実行結果
0 => '0'
1 => '1'
2 => 'year'
3 => 'month'
4 => ''

year => 2
month => 3
0 => 0
1 => 1
2 => -1
non-existent => -1