83459


C#で、次のように文字列を分割すると、stArrayに5つの要素が入ります。

[code]

    string testString = "a,b,c,d,e";
    string[] strArray = testString.Split(',');
    
[/code]

これを最初の','だけ分割して、"a"と"b,c,d,e"に分割して  
"b,c,d,e"の部分だけ取得するにはどうしたら良いですか？


CC BY-SA 4.0
2021-11-06T21:52:54.200
83457
2021-11-07T01:13:57.907
34471
question
c#
C#で文字列を1つだけ分割する方法


[String.Split メソッド](https://docs.microsoft.com/ja-
jp/dotnet/api/system.string.split?view=net-5.0#System_String_Split_System_Char___System_Int32_)を見ればわかりますが、複数のオーバーロードが用意されています。必要な機能を持つバージョンを選択してください。具体的には
[`Split(Char[], Int32)`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.string.split?view=net-5.0#System_String_Split_System_Char___System_Int32_)
が該当します。

* * *

なお、

>
[code]

>     testString.Split(',');
>  
[/code]

とありますが、こちらは [`Split(Char[])`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.string.split?view=net-5.0#System_String_Split_System_Char___)
であり具体的には

[code]

    public string[] Split (params char[]? separator);
    
[/code]

という形式です。引数は `','` と記述していますが、C#コンパイラは [`params`](https://docs.microsoft.com/ja-
jp/dotnet/csharp/language-reference/keywords/params) 指定を受けて引数を `new Char[1] {
',' }` と読み替えてコンパイルしています。

対して、 `Split(Char[], Int32)` は

[code]

    public string[] Split (char[]? separator, int count);
    
[/code]

という形式でこちらは `params`
指定がありません（`params`は最終引数にしか使えないため）。C#コンパイラは前述のような読み替えはありませんので、明示的に記述する必要があります。最終的には次のような記述になるかと思います。

[code]

    var strArray = testString.Split(new []{ ',' }, 2);
    
[/code]

* * *

> "b,c,d,e"の部分だけ取得するには

という質問に答えて `String.IndexOf` および `String.Substring`
を組み合わせた回答が投稿されています。もちろんこれらも希望を満たす結果となっていますが、別アプローチも提案します。

正規表現を使用することで、条件を満たした文字列を抽出することができます。例えば

[code]

    var m1 = Regex.Match(testString, "^(?:([^,]*),){1}(.*)");
    
[/code]

と書けます。`m1`は次のような値が格納されます。

  * `m1.Groups[1].Captures[0].Value` = `"a"`
  * `m1.Groups[2].Value` = `"b,c,d,e"`

この方法ですと分割数を変更したくなった場合も簡単です。

[code]

    var m2 = Regex.Match(testString, "^(?:([^,]*),){2}(.*)");
    
[/code]

と変更すると`m2`は次のような値が格納されます。

  * `m2.Groups[1].Captures[0].Value` = `"a"`
  * `m2.Groups[1].Captures[1].Value` = `"b"`
  * `m2.Groups[2].Value` = `"c,d,e"`

`String.IndexOf` ＋ `String.Substring` ではここまで柔軟な動作をさせることができません。

なおこの正規表現は手抜きをしていて改行が含まれていると正しく動作しません。


CC BY-SA 4.0
2021-11-06T22:49:59.443
83459
2021-11-07T01:13:57.907
2021-11-07T01:13:57.907
4236
4236
83457
answer


これでどうでしょうか？

[code]

    string testString = "a,b,c,d,e";
    
    // 最初の','の位置
    int i = testString.IndexOf(',');
    
    // 最初の位置より後を切り出す
    string s = testString.Substring(i + 1);
    
    // b,c,d,e
    Console.WriteLine(s);
    
[/code]


CC BY-SA 4.0
2021-11-06T22:55:25.417
83461
2021-11-06T22:55:25.417
4982
83457
answer