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