RegexOptions.ExplicitCaptureを指定した場合、明示的に名前を与えたグループのみがキャプチャされるようになり、それ以外のグループ化構成要素はグループ化から除外されます。 正規表現要素(?:)
が明示的にキャプチャの除外対象を指定するものであるのに対し、RegexOptions.ExplicitCaptureは名前付きグループと組み合わせて明示的にキャプチャの対象を指定するものです。
次の例では、RegexOptionsがNoneの場合(指定しない場合のデフォルト)と、RegexOptions.ExplicitCaptureの場合でキャプチャされる結果の違いを示しています。 RegexOptions.Noneではグループ名を与えていないグループもキャプチャされるのに対し、RegexOptions.ExplicitCaptureではグループ名を与えているグループのみがキャプチャされています。
RegexOptions.ExplicitCaptureを指定して明示的にグループ名を指定したグループのみをキャプチャする
Imports System
Imports System.Text.RegularExpressions
Class Sample
Shared Sub Main()
Dim text As String = "2016/02/29 00:00:00"
Console.WriteLine(text)
' yyyy/mm/dd形式の日付 (yyyy部分のみ名前付きグループでグループ化)
Dim pattern As String = "(?<y>\d{4})/(\d{2})/(\d{2})"
' RegexOptions.Noneの場合にキャプチャされるグループを列挙して表示
Console.WriteLine("[RegexOptions.None]")
For Each g As Group In Regex.Match(text, pattern, RegexOptions.None).Groups
Console.WriteLine(g.Value)
Next
' RegexOptions.ExplicitCaptureの場合にキャプチャされるグループを列挙して表示
Console.WriteLine("[RegexOptions.ExplicitCapture]")
For Each g As Group In Regex.Match(text, pattern, RegexOptions.ExplicitCapture).Groups
Console.WriteLine(g.Value)
Next
End Sub
End Class
実行結果
[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)を参照してください。