RegexOptions.ExplicitCaptureを指定した場合、明示的に名前を与えたグループのみがキャプチャされるようになり、それ以外のグループ化構成要素はグループ化から除外されます。 正規表現要素(?:)
が明示的にキャプチャの除外対象を指定するものであるのに対し、RegexOptions.ExplicitCaptureは名前付きグループと組み合わせて明示的にキャプチャの対象を指定するものです。
次の例では、RegexOptionsがNoneの場合(指定しない場合のデフォルト)と、RegexOptions.ExplicitCaptureの場合でキャプチャされる結果の違いを示しています。 RegexOptions.Noneではグループ名を与えていないグループもキャプチャされるのに対し、RegexOptions.ExplicitCaptureではグループ名を与えているグループのみがキャプチャされています。
RegexOptions.ExplicitCaptureを指定して明示的にグループ名を指定したグループのみをキャプチャする
using System;
using System.Text.RegularExpressions;
class Sample {
static void Main()
{
var text = "2016/02/29 00:00:00";
// yyyy/mm/dd形式の日付 (yyyy部分のみ名前付きグループでグループ化)
var pattern = @"(?<y>\d{4})/(\d{2})/(\d{2})";
// RegexOptions.Noneの場合にキャプチャされるグループを列挙して表示
Console.WriteLine("[RegexOptions.None]");
foreach (Group g in Regex.Match(text, pattern, RegexOptions.None).Groups) {
Console.WriteLine(g.Value);
}
// RegexOptions.ExplicitCaptureの場合にキャプチャされるグループを列挙して表示
Console.WriteLine("[RegexOptions.ExplicitCapture]");
foreach (Group g in Regex.Match(text, pattern, RegexOptions.ExplicitCapture).Groups) {
Console.WriteLine(g.Value);
}
}
}
実行結果
[RegexOptions.None] 2016/02/29 02 29 2016 [RegexOptions.ExplicitCapture] 2016/02/29 2016
上記の結果にもあるように、RegexOptions.ExplicitCaptureによって明示的なグループ化を行った場合でも、match.Groupsプロパティにはインデックスが0のグループ、つまりマッチした箇所全体を表すグループが常に含まれます。
Regex.Splitメソッドでグループ化した正規表現を区切りとして分割する場合、RegexOptions.ExplicitCaptureを指定するかどうかで結果が変わります。 具体的な結果の違いについては§.グループ化された正規表現による分割 (Regex.Split)を参照してください。