.NET Core 3.0以降のGroupCollectionは、IReadOnlyDictionary<string, Group>インターフェイスも実装しています。 これにしたがって、GroupCollectionをディクショナリとして扱えるほか、グループ・名前付きグループをKeyValuePair<string, Group>として取得することができます。
IReadOnlyDictionaryインターフェイスを介してGroupCollectionを列挙する
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class Sample {
static void Main()
{
var text = "2020-09-01";
// yyyy-mm-dd形式の日付にマッチする正規表現
// (yyyy部分・mm部分はそれぞれ名前'y'と'm'としてグループ化、dd部分は名前なしでグループ化)
var pattern = @"(?<y>\d{4})-(?<m>\d{2})-(\d{2})";
var m = Regex.Match(text, pattern);
// マッチしたグループを、KeyValuePair<string, Group>として列挙する
foreach (var (name, group) in (IReadOnlyDictionary<string, Group>)m.Groups) {
Console.WriteLine($"{name} => {group.Value}");
}
}
}
実行結果
0 => 2020-09-01 1 => 01 y => 2020 m => 09
上記の結果にも現れているように、IReadOnlyDictionary<string, Group>を介したアクセスの場合、名前なし・名前付きに関わらずグループ化された部分が列挙されます。 また、名前なしのグループでは、グループ番号は文字列のキーとして列挙され、マッチ箇所全体を表すグループとして"0"
が常に含まれます。
このほかにもGroupCollectionでIReadOnlyDictionary由来のメソッド・プロパティとして、Keysプロパティ・ContainsKeyメソッド・TryGetValueメソッドを使うこともできます。 これらのメソッド・プロパティは、正規表現にマッチしたかどうかで返す値が変わります。 具体的には、ContainsKeyメソッド・TryGetValueメソッドは、正規表現にマッチした場合、かつ正規表現内に指定された名前・番号のグループを含む場合のみtrue
を返します。 つまり、特定の名前・番号のグループにマッチしたかどうか表す値を返すのではないため、逆にいえばこのメソッドの戻り値から正規表現全体がマッチしたかどうかを知ることができます。