GroupCollectionクラスは、名前の通り複数のGroupを格納するためのコレクションクラスです。 Match.Groupsプロパティの型はGroupCollectionとなっていて、マッチした正規表現のグループすべてに対応するGroupが格納された状態で返されます。
Match.Groupsプロパティはインデクサによってグループ番号・グループ名に対応するGroupを取得することができるほか、foreach/For Eachによってすべてのグループを列挙することもできます。 このとき、正規表現内にグループが含まれているかどうかに関わらず、常にマッチ箇所全体を表すグループが列挙されます。
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で解説しています。