()
および(?<name>)
ではグループ番号やグループ名を与えたグループ化がなされますが、正規表現要素(?:)
を使うと、グループ番号やグループ名を持たないグループ(キャプチャされないグループ・非キャプチャグループ)を構成することができます。 非キャプチャグループは、例えば正規表現を記述する上で()
を使いたいが、Match.Groupsプロパティ等で処理する必要のない・除外したいグループを構成したいような場合に用いることができます。
次の例では、yyyy-mm-dd形式またはyyyy/mm/dd形式の日付にマッチする文字列を探索し、yyyy年mm月dd日の形式に置換しています。 この際、区切り文字の正規表現(/|-)
を非キャプチャグループとすることでグループ化から除外しています。 これにより、年・月・日のそれぞれ対応するグループのみにグループ番号1・2・3が割り当てられます。
非キャプチャグループを含む正規表現を使ってyyyy-mm-ddまたはyyyy/mm/dd形式の日付をyyyy年mm月dd日の形式に置換する
using System;
using System.Text.RegularExpressions;
class Sample {
static void Main()
{
var text = "2016/01/23 2016-04-05";
// yyyy-mm-dd形式またはyyyy/mm/dd形式の日付
// (年月日部分のみがグループ化され、区切り文字の部分はグループ化から除外されるため
// グループ番号1=年、番号2=月、番号3=日となる)
var pattern = @"(\d{4})(?:/|-)(\d{2})(?:/|-)(\d{2})";
// 上記の正規表現にマッチする日付をyyyy年mm月dd日の形式に置換する
Console.WriteLine(Regex.Replace(text, pattern, "$1年$2月$3日"));
}
}
実行結果
2016年01月23日 2016年04月05日