GroupCollectionクラスは、名前の通り複数のGroupを格納するためのコレクションクラスです。 Match.Groupsプロパティの型はGroupCollectionとなっていて、マッチした正規表現のグループすべてに対応するGroupが格納された状態で返されます。

Match.Groupsプロパティはインデクサによってグループ番号・グループ名に対応するGroupを取得することができるほか、foreach/For Eachによってすべてのグループを列挙することもできます。 このとき、正規表現内にグループが含まれているかどうかに関わらず、常にマッチ箇所全体を表すグループが列挙されます。

Match.Groupsプロパティからすべてのグループを列挙する
Imports System
Imports System.Text.RegularExpressions

Class Sample
  Shared Sub Main()
    Dim text As String = "2016-02-29 00:00:00"
    Dim pattern As String = "(\d{4})-(\d{2})-(\d{2})" ' yyyy-mm-dd形式の日付

    Dim m As Match = Regex.Match(text, pattern)

    If m.Success Then
      ' Match.Groupsプロパティから、すべてのグループを取得して表示する
      For Each g As Group In m.Groups
        Console.WriteLine(g.Value)
      Next
    End If
  End Sub
End Class
実行結果
2016-02-29
2016
02
29

GroupCollectionは当初、非ジェネリックなIEnumerableのみを実装した型指定されていないコレクションとして登場し、その後.NET Standard 2.1/.NET Core 2.0にてIEnumerable<Group>/ICollection<Group>/IList<Group>を実装するようになり、型指定されたコレクションとして扱うことができるようになっています。

一方、IEnumerable<Group>の実装以降でも、GroupCollection.GetEnumeratorメソッドは(おそらく)互換性のため型指定されていないIEnumeratorを返す実装のままとなっています。 このため、GroupCollectionをforeachで列挙する場合、varによる暗黙的な型指定を行うとobjectとして列挙されます

代替手法やGroupCollectionのジェネリックインターフェイスについてより詳しくは§.MatchCollection・GroupCollection・CaptureCollectionとジェネリックコレクションインターフェイスを参照してください。

.NET Core 3.0以降では、GroupCollectionはIReadOnlyDictionary<string, Group>インターフェイスを実装しています。 これにより、GroupCollectionをDictionaryと同様に扱うことができるようになっています。 詳しくは§.GroupCollectionとIReadOnlyDictionaryで解説しています。