明示的なグループ化を行っていない正規表現を区切りとして用いる場合、RegexOptionsの指定によっても結果が変わります。 RegexOptions.ExplicitCaptureを指定すると明示的なグループ(名前付きのグループ)のみがキャプチャされることになるため、名前付きでないグループはグループ化していない場合と同様に扱われます。
区切りの正規表現が明示的でないグループ化の場合、RegexOptions.ExplicitCaptureを指定するかどうかでRegex.Splitメソッドの結果が変わる
using System;
using System.Text.RegularExpressions;
class Sample {
static void Main()
{
var path = "path/to/file.txt"; // ファイルパス
var pattern = @"(\\|/)"; // 区切りとして用いる正規表現(明示的ではないグループ)
// 明示的ではないグループ化を行っている正規表現を区切りとして分割する
// (RegexOptions.Noneでは、正規表現がグループ化されたものとして扱われるため、
// 区切り文字自体も結果に含まれる)
Console.WriteLine("[RegexOptions.None]");
foreach (var p in Regex.Split(path, pattern, RegexOptions.None)) {
Console.WriteLine(p);
}
// (RegexOptions.ExplicitCaptureでは、明示的でないグループはグループ化されていない場合と
// 同等に扱われるため、区切り文字は結果に含まれない)
Console.WriteLine("[RegexOptions.ExplicitCapture]");
foreach (var p in Regex.Split(path, pattern, RegexOptions.ExplicitCapture)) {
Console.WriteLine(p);
}
}
}
実行結果
[RegexOptions.None] path / to / file.txt [RegexOptions.ExplicitCapture] path to file.txt