16553


文字列を区切りたいのですが、区切り文字列を含めたままリストなどに分割する方法を教えてください

入力： `"aaa,bbb,,"`  
出力： `"aaa,"` と `"bbb,"` と `","`


CC BY-SA 3.0
2015-09-12T15:56:31.890
16549
2015-09-14T00:22:49.247
2015-09-13T10:04:32.897
8870
8870
question
c# 正規表現
区切り文字列を含めたまま分割する方法


正規表現を使えば目的の文字列に分割できます

[code]

    foreach (Match m in Regex.Matches(item, @"((?!,).*?,?|(?!,).+)"))
    {
        Debug.WriteLine(m.Value);
    }
    
[/code]


CC BY-SA 3.0
2015-09-12T15:56:31.890
16550
2015-09-13T10:05:41.833
2015-09-13T10:05:41.833
8870
8870
16549
answer


質問が`\n`区切りから`,`区切りと別物に差し替えられたので全面的に修正しました。

[String.Split()](https://msdn.microsoft.com/ja-
jp/library/system.string.split\(v=vs.110\).aspx)で機能が足りない場合は[Regex.Split()](https://msdn.microsoft.com/ja-
jp/library/system.text.regularexpressions.regex.split\(v=vs.110\).aspx)で分割できます。

[code]

    Regex.Split("aaa,bbb,,", ",");
    // => "aaa", "bbb", "", ""
    
[/code]

区切り文字を含めたい場合は正規表現をグループ化します。

[code]

    Regex.Split("aaa,bbb,,", "([^,]*,)");
    // => "", "aaa", "", "bbb,", "", ",", ""
    
[/code]

これでは区切り文字に挟まれた部分が空文字列として挿入されてしまいますので、発想を変えます。正規表現で文字をマッチさせるのではなくゼロ幅アサーションで区切り位置だけを指定します。今回の場合、`,`の後ろ、つまりゼロ幅の正の後読みアサーションで`,`を探してやることです。

[code]

    Regex.Split("aaa,bbb,,", "(?<=,)");
    // => { "aaa,", "bbb,", ",", "" }
    
[/code]

`Split`で区切るという都合上、末尾にゴミとなる空文字列が付いてしまいましたが、これについてもゼロ幅の肯定先読みアサーションで回避できます。

[code]

    var splitted = Regex.Split("aaa,bbb,,", "(?<=,)(?=.)");
    // => { "aaa,", "bbb,", "," }
    
[/code]

* * *

区切り文字を含めたままという本題からは外れますが、[StringReader.ReadLine()](https://msdn.microsoft.com/ja-
jp/library/system.io.stringreader.readline\(v=vs.110\).aspx)を使って文字列を文字列に分割することもできます。（当初の質問文では`\n`区切りでしたので`ReadLine`を紹介しましたが、`,`区切りには使えません。）


CC BY-SA 3.0
2015-09-12T21:12:47.757
16553
2015-09-13T21:31:46.457
2015-09-13T21:31:46.457
4236
4236
16549
answer