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

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

Regex.GroupNameFromNumber/GroupNumberFromNameメソッドで正規表現内で定義されているグループ番号/グループ名の対応を取得する
Imports System
Imports System.Text.RegularExpressions

Class Sample
  Shared Sub Main()
    Dim pattern As String = "(?<year>\d{4})-(?<month>\d{2})-(\d{2})" ' yyyy-mm-dd

    ' GetGroupNumbers/GetGroupNamesメソッドはインスタンスメソッドであるため、
    ' インスタンス化された正規表現に対してのみ使用できる
    Dim re As 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が返される
  End Sub
End Class
実行結果
0 => '0'
1 => '1'
2 => 'year'
3 => 'month'
4 => ''

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