Regex.Splitメソッドを用いた正規表現による文字列分割では、区切りとして指定する正規表現がキャプチャされるかどうかによって動作が異なります。 つまり、グループ化されているかどうか、またグループ化されている場合は非キャプチャグループかどうかで結果が変わります。 区切りの正規表現がグループ化されている場合、分割した結果にはグループにマッチした部分、つまり区切り文字列自体も含まれます。 一方、グループ化されていない場合・非キャプチャグループの場合は、分割した結果に区切り文字列は含まれません

次の例では、ディレクトリ区切り文字として\または/を用いてRegex.Splitメソッドでファイルパスの分割を行っています。 このとき、区切りの正規表現\\|/をグループ化しているか・非キャプチャグループかどうかによってRegex.Splitメソッドの結果が変わります。

区切りの正規表現がグループ化されているかどうかでRegex.Splitメソッドの結果が変わる
Imports System
Imports System.Text.RegularExpressions

Class Sample
  Shared Sub Main()
    Dim path As String = "path/to/file.txt" ' ファイルパス

    ' グループ化した正規表現を区切りとして分割する
    ' (分割結果には区切りの文字列自体も含まれる)
    Console.WriteLine("[grouping]")
    For Each p As String In Regex.Split(path, "(\\|/)")
      Console.WriteLine(p)
    Next
    Console.WriteLine()

    ' 非キャプチャグループ化した正規表現を区切りとして分割する
    ' (分割結果に区切りの文字列が含まれなくなる)
    Console.WriteLine("[non-capturing group]")
    For Each p As String In Regex.Split(path, "(?:\\|/)")
      Console.WriteLine(p)
    Next
    Console.WriteLine()

    ' グループ化していない正規表現を区切りとして分割する
    ' (分割結果に区切りの文字列が含まれなくなる)
    Console.WriteLine("[non-grouping]")
    For Each p As String In Regex.Split(path, "\\|/")
      Console.WriteLine(p)
    Next
    Console.WriteLine()
  End Sub
End Class
実行結果
[grouping]
path
/
to
/
file.txt

[non-capturing group]
path
to
file.txt

[non-grouping]
path
to
file.txt

逆に言えば、Regex.Splitメソッドで区切り文字自体も分割結果に含めたい場合は、この動作を利用して区切りの正規表現をグループ化すれば・キャプチャさせればよいことになります。

さらに、明示的なグループ化を行っていない正規表現を区切りとして用いる場合は、RegexOptionsの指定によっても結果が変わることになります。 RegexOptions.ExplicitCaptureを指定すると明示的なグループ(名前付きのグループ)のみがキャプチャされることになるため、名前付きでないグループはグループ化されていない場合・非キャプチャグループの場合と同様に扱われます。

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。