C#のSplit完全ガイド|文字列分割の基本から複数区切り文字・空要素削除・よくあるエラー対策まで

1. C#のSplitメソッドとは

C#のSplitは、指定した区切り文字を基準に文字列を分割するメソッドです。

たとえば、次のようにカンマで区切られた文字列があるとします。

string text = "apple,banana,orange";

この文字列に対してSplitを使用すると、applebananaorangeという3つの文字列に分割できます。

string[] fruits = text.Split(',');

Splitは、ユーザー入力の解析、CSVデータの処理、ログの解析、ファイルパスやコマンド文字列の分解など、さまざまな場面で利用されます。

1-1. Splitで文字列を分割する仕組み

Splitメソッドは、対象となる文字列の中から指定された区切り文字を探し、その位置で文字列を分割します。

string text = "red,green,blue";string[] colors = text.Split(',');

このコードでは、カンマが区切り文字です。処理結果は次のようなイメージになります。

colors[0] = "red"colors[1] = "green"colors[2] = "blue"

区切り文字そのものは、通常、分割後の文字列には含まれません。

Console.WriteLine(colors[0]); // redConsole.WriteLine(colors[1]); // greenConsole.WriteLine(colors[2]); // blue

対象の文字列に区切り文字が含まれていない場合は、元の文字列が1つの要素として返されます。

string text = "apple";string[] result = text.Split(',');

Console.WriteLine(result.Length); // 1Console.WriteLine(result[0]); // apple

また、区切り文字が連続している場合、区切り文字の間は空文字として扱われます。

string text = "apple,,orange";string[] result = text.Split(',');

Console.WriteLine(result.Length); // 3Console.WriteLine(result[0]); // appleConsole.WriteLine(result[1]); // 空文字Console.WriteLine(result[2]); // orange

空文字を結果から除外したい場合は、StringSplitOptions.RemoveEmptyEntriesを指定します。

string[] result = text.Split(',',StringSplitOptions.RemoveEmptyEntries);

この場合、分割結果はappleorangeの2要素になります。

1-2. Splitの戻り値はstring型の配列

Splitメソッドの戻り値は、string[]、つまり文字列型の配列です。

string text = "A,B,C";string[] result = text.Split(',');

resultには、分割された文字列が順番に格納されます。

Console.WriteLine(result[0]); // AConsole.WriteLine(result[1]); // BConsole.WriteLine(result[2]); // C

戻り値を単一のstring型変数で受け取ることはできません。

string text = "A,B,C";

// コンパイルエラーstring result = text.Split(',');

Splitの結果を受け取るときは、次のようにstring[]を使用します。

string[] result = text.Split(',');

型推論を利用して、varで記述することもできます。

var result = text.Split(',');

この場合も、実際の型はstring[]です。

配列であるため、要素数はLengthプロパティで取得できます。

Console.WriteLine(result.Length);

各要素には、0から始まるインデックスを指定してアクセスします。

Console.WriteLine(result[0]);

存在しないインデックスを指定すると、IndexOutOfRangeExceptionが発生します。

string[] result = "A,B,C".Split(',');

// 要素数は3なので、有効なインデックスは0~2Console.WriteLine(result[3]);

安全に取得する場合は、要素数を確認してからアクセスします。

if (result.Length > 2){Console.WriteLine(result[2]);}

1-3. Splitの基本構文と主なオーバーロード

Splitの基本的な書き方は次のとおりです。

string[] 分割結果 = 対象文字列.Split(区切り文字);

1文字を区切り文字として使用する場合は、char型の値を指定します。

string[] result = text.Split(',');

文字列を区切りとして使用する場合は、string型の値またはstring配列を指定します。

string[] result = text.Split(new[] { "--" },StringSplitOptions.None);

代表的な使用方法は次のとおりです。

// 1文字で分割string[] result1 = text.Split(',');

// 複数の1文字区切りで分割string[] result2 = text.Split(',', ';', '|');

// 空要素を削除string[] result3 = text.Split(',',StringSplitOptions.RemoveEmptyEntries);

// 分割数を制限string[] result4 = text.Split(',',2,StringSplitOptions.None);

// 複数文字の文字列で分割string[] result5 = text.Split(new[] { "::" },StringSplitOptions.None);

StringSplitOptionsには、主に次のオプションがあります。

StringSplitOptions.Noneを指定すると、空文字を含めてすべての要素を返します。

string text = "A,,C";

string[] result = text.Split(',',StringSplitOptions.None);

Console.WriteLine(result.Length); // 3

StringSplitOptions.RemoveEmptyEntriesを指定すると、空文字の要素を除外します。

string[] result = text.Split(',',StringSplitOptions.RemoveEmptyEntries);

Console.WriteLine(result.Length); // 2

StringSplitOptions.TrimEntriesを指定すると、分割後の各要素の前後にある空白を削除できます。

string text = "apple, banana , orange";

string[] result = text.Split(',',StringSplitOptions.TrimEntries);

分割結果は次のとおりです。

applebananaorange

空要素の削除と前後の空白削除は、組み合わせて指定できます。

string text = "apple, , banana,,orange";

string[] result = text.Split(',',StringSplitOptions.RemoveEmptyEntries |StringSplitOptions.TrimEntries);

この場合、空白だけの要素や空文字が除外され、各要素の前後の空白も削除されます。

なお、TrimEntriesは比較的新しい.NETで使用できるオプションです。古い.NET Frameworkなど、対象環境によって利用できない場合は、分割後にTrimメソッドを使用します。

string[] result = text.Split(',');

for (int i = 0; i < result.Length; i++){result[i] = result[i].Trim();}

1-4. char区切りとstring区切りの違い

Splitで指定する区切りには、主にcharstringがあります。

charは、カンマやスペースなど、1文字の区切りに使用します。

string text = "A,B,C";string[] result = text.Split(',');

charリテラルは、シングルクォーテーションで囲みます。

','' ''\t''\n'

一方、stringは複数文字で構成される区切り文字列に使用します。

string text = "A--B--C";

string[] result = text.Split(new[] { "--" },StringSplitOptions.None);

stringリテラルは、ダブルクォーテーションで囲みます。

"--""::""<br>"

次のコードでは、'-'という1文字ごとに分割されます。

string text = "A--B--C";string[] result = text.Split('-');

結果には、連続するハイフンの間に空要素が含まれます。

A空文字B空文字C

"--"という2文字のまとまりで分割したい場合は、文字列区切りを使用します。

string[] result = text.Split(new[] { "--" },StringSplitOptions.None);

結果は次のとおりです。

ABC

よくある間違いは、1文字の区切りをダブルクォーテーションで指定したり、複数文字の区切りをシングルクォーテーションで指定したりすることです。

// chartext.Split(',');

// stringを配列で指定text.Split(new[] { "," },StringSplitOptions.None);

複数文字をシングルクォーテーションで囲むことはできません。

// コンパイルエラーtext.Split('--');

1文字だけならchar、複数文字を1つの区切りとして扱うならstringを使用すると覚えておきましょう。

2. C#のSplitで文字列を分割する基本的な使い方

ここからは、C#のSplitを使って文字列を分割する基本的な方法を、区切り文字別に解説します。

2-1. カンマで文字列を分割する

カンマ区切りの文字列を分割する場合は、Split(',')と記述します。

string text = "apple,banana,orange";string[] fruits = text.Split(',');

foreach (string fruit in fruits){Console.WriteLine(fruit);}

実行結果は次のとおりです。

applebananaorange

カンマの後ろにスペースが入っている場合、スペースも分割後の文字列に残ります。

string text = "apple, banana, orange";string[] fruits = text.Split(',');

この場合、2番目と3番目の要素の先頭にはスペースが含まれます。

"apple"" banana"" orange"

前後のスペースを削除する場合は、TrimEntriesを指定します。

string[] fruits = text.Split(',',StringSplitOptions.TrimEntries);

古い環境では、各要素にTrimを適用します。

string[] fruits = text.Split(',');

foreach (string fruit in fruits){Console.WriteLine(fruit.Trim());}

ただし、単純なSplit(',')だけでは、一般的なCSVファイルを完全には解析できない点に注意が必要です。

たとえば、CSVでは次のように、ダブルクォーテーションで囲まれた値の中にカンマが含まれることがあります。

Tanaka,"Tokyo, Japan",30

この文字列を単純にカンマで分割すると、"Tokyo, Japan"の途中でも分割されてしまいます。引用符やエスケープを含む正式なCSVを処理する場合は、CSV形式に対応したライブラリやパーサーを使用する必要があります。

2-2. スペースで文字列を分割する

半角スペースで文字列を分割する場合は、スペース文字を指定します。

string text = "C# Split Method";string[] words = text.Split(' ');

foreach (string word in words){Console.WriteLine(word);}

実行結果は次のとおりです。

C#SplitMethod

文字列内にスペースが連続している場合、空文字が分割結果に含まれます。

string text = "C#  Split   Method";string[] words = text.Split(' ');

空要素を削除するには、StringSplitOptions.RemoveEmptyEntriesを指定します。

string[] words = text.Split(' ',StringSplitOptions.RemoveEmptyEntries);

これにより、スペースが複数連続していても、次の3要素だけを取得できます。

C#SplitMethod

半角スペースだけでなく、タブや改行などの空白文字全般で分割したい場合は、複数の区切り文字を指定します。

char[] separators = { ' ', '\t', '\r', '\n' };

string[] words = text.Split(separators,StringSplitOptions.RemoveEmptyEntries);

また、利用する.NETのバージョンや目的によっては、区切り文字を明示せず、空白文字を基準に分割するオーバーロードを利用できる場合もあります。

string[] words = text.Split((char[]?)null,StringSplitOptions.RemoveEmptyEntries);

ただし、コードの意図を分かりやすくするため、対象となる空白文字を明示的に指定する方法もよく使われます。

2-3. タブや改行コードで文字列を分割する

タブを区切り文字として使う場合は、エスケープシーケンスの\tを指定します。

string text = "商品名\t価格\t在庫数";string[] columns = text.Split('\t');

foreach (string column in columns){Console.WriteLine(column);}

実行結果は次のとおりです。

商品名価格在庫数

改行で文字列を分割する場合、改行コードの違いに注意が必要です。

主な改行コードには、次のものがあります。

\n    LF\r\n  CRLF\r    CR

単純に改行に含まれる各文字で分割する場合は、\r\nを指定できます。

string text = "1行目\r\n2行目\r\n3行目";

string[] lines = text.Split(new[] { '\r', '\n' },StringSplitOptions.RemoveEmptyEntries);

Windowsで一般的な\r\nを、2文字で構成される1つの区切りとして扱いたい場合は、string配列を使用します。

string[] lines = text.Split(new[] { "\r\n" },StringSplitOptions.None);

ただし、実行環境や入力元によって改行コードが異なる可能性があります。複数の改行形式に対応する場合は、次のように指定できます。

string[] lines = text.Split(new[] { "\r\n", "\n", "\r" },StringSplitOptions.None);

空行を除外したい場合は、RemoveEmptyEntriesを指定します。

string[] lines = text.Split(new[] { "\r\n", "\n", "\r" },StringSplitOptions.RemoveEmptyEntries);

環境に依存した改行文字列を使用する場合は、Environment.NewLineも利用できます。

string[] lines = text.Split(new[] { Environment.NewLine },StringSplitOptions.None);

ただし、Environment.NewLineは現在の実行環境の改行コードを表します。外部ファイルやWeb APIから受け取った文字列が、同じ改行コードを使用しているとは限りません。さまざまな入力形式を処理する場合は、複数の改行コードに対応する方法が安全です。

2-4. 分割結果をforeachで取り出す

Splitの戻り値は配列なので、foreach文を使って各要素を順番に取り出せます。

string text = "red,green,blue";string[] colors = text.Split(',');

foreach (string color in colors){Console.WriteLine(color);}

Splitの戻り値を変数に代入せず、そのままforeachで使用することもできます。

string text = "red,green,blue";

foreach (string color in text.Split(',')){Console.WriteLine(color);}

前後の空白を削除し、空要素も除外した状態で繰り返す場合は、次のように記述できます。

string text = "red, , green,,blue";

foreach (string color in text.Split(',',StringSplitOptions.RemoveEmptyEntries |StringSplitOptions.TrimEntries)){Console.WriteLine(color);}

実行結果は次のとおりです。

redgreenblue

各要素に番号を付けたい場合は、for文を使用するとインデックスを扱いやすくなります。

string[] colors = text.Split(',',StringSplitOptions.RemoveEmptyEntries |StringSplitOptions.TrimEntries);

for (int i = 0; i < colors.Length; i++){Console.WriteLine($"{i}: {colors[i]}");}

配列の内容を書き換える必要がなく、要素を順番に処理するだけであれば、foreachが簡潔です。インデックスが必要な場合や配列の要素を書き換える場合は、forが適しています。

2-5. 分割後の要素数や特定の要素を取得する

分割後の要素数は、配列のLengthプロパティで取得します。

string text = "A,B,C";string[] result = text.Split(',');

Console.WriteLine(result.Length); // 3

特定の要素を取得する場合は、インデックスを指定します。

Console.WriteLine(result[0]); // AConsole.WriteLine(result[1]); // BConsole.WriteLine(result[2]); // C

C#の配列インデックスは0から始まります。最初の要素はresult[0]です。

最後の要素は、Length - 1を指定して取得できます。

string last = result[result.Length - 1];Console.WriteLine(last); // C

利用可能な環境では、インデックス演算子を使って最後の要素を取得することもできます。

string last = result[^1];

分割結果が空になる可能性を考慮する場合は、要素数を確認します。

if (result.Length > 0){Console.WriteLine(result[0]);}

ただし、通常のSplitは、空文字を分割した場合でも1要素の配列を返すことがあります。

string text = "";string[] result = text.Split(',');

Console.WriteLine(result.Length); // 1Console.WriteLine(result[0] == ""); // True

一方、RemoveEmptyEntriesを指定すると、結果が空の配列になることがあります。

string text = "";

string[] result = text.Split(',',StringSplitOptions.RemoveEmptyEntries);

Console.WriteLine(result.Length); // 0

この状態でresult[0]へアクセスすると、IndexOutOfRangeExceptionが発生します。

// resultが空配列の場合は例外Console.WriteLine(result[0]);

安全に特定の要素を取得するには、要素数を確認してください。

if (result.Length >= 2){string second = result[1];Console.WriteLine(second);}

分割数を制限すると、残りの文字列を最後の要素にまとめられます。

string text = "name=Tanaka=Admin";

string[] result = text.Split('=',2,StringSplitOptions.None);

Console.WriteLine(result[0]); // nameConsole.WriteLine(result[1]); // Tanaka=Admin

設定文字列やキーと値の組み合わせを処理する場合、区切り文字が値の中にも含まれる可能性があります。そのようなときは、分割数を制限すると便利です。

3. 複数の区切り文字を指定してSplitする方法

Splitでは、1つだけでなく複数の区切り文字を指定できます。

たとえば、カンマ、セミコロン、縦線のいずれかで区切られた文字列を、まとめて分割できます。

string text = "A,B;C|D";

複数の区切り文字を扱う方法は、区切りが1文字ずつなのか、複数文字の文字列なのかによって異なります。

3-1. char配列で複数の1文字区切りを指定する

複数の1文字区切りを指定する場合は、char配列を使用します。

string text = "apple,banana;orange|grape";char[] separators = { ',', ';', '|' };

string[] fruits = text.Split(separators);

分割結果は次のとおりです。

applebananaorangegrape

foreachで取り出す場合は、次のように記述します。

foreach (string fruit in fruits){Console.WriteLine(fruit);}

配列を変数として用意せず、直接指定することもできます。

string[] fruits = text.Split(new[] { ',', ';', '|' });

使用するC#や.NETのバージョンによっては、次のように区切り文字を並べて記述できるオーバーロードも利用できます。

string[] fruits = text.Split(',', ';', '|');

区切り文字の連続によって発生する空要素を削除する場合は、RemoveEmptyEntriesを指定します。

string text = "apple,,banana;|orange";

char[] separators = { ',', ';', '|' };

string[] fruits = text.Split(separators,StringSplitOptions.RemoveEmptyEntries);

結果は次のとおりです。

applebananaorange

区切り文字の前後にある空白も削除する場合は、TrimEntriesを組み合わせます。

string text = "apple,  banana ; ; orange | grape";

char[] separators = { ',', ';', '|' };

string[] fruits = text.Split(separators,StringSplitOptions.RemoveEmptyEntries |StringSplitOptions.TrimEntries);

結果は次のとおりです。

applebananaorangegrape

スペース、タブ、改行をまとめて区切り文字にすることもできます。

string text = "C# Split\t文字列\n分割";

char[] separators = { ' ', '\t', '\r', '\n' };

string[] words = text.Split(separators,StringSplitOptions.RemoveEmptyEntries);

foreach (string word in words){Console.WriteLine(word);}

実行結果は次のとおりです。

C#Split文字列分割

複数の区切り文字を指定するときに注意したいのが、char配列では各文字が個別の区切りとして扱われる点です。

char[] separators = { '-', ':' };

この指定では、ハイフンまたはコロンが1文字現れるたびに分割されます。"--""::"を1つの区切り文字列として扱う指定ではありません。

複数文字の区切りを指定したい場合は、string配列を使用します。

string text = "A--B::C";

string[] result = text.Split(new[] { "--", "::" },StringSplitOptions.None);

分割結果は次のとおりです。

ABC

Splitを使用する際によくあるエラーとして、対象の文字列がnullであるケースも挙げられます。

string? text = null;

// NullReferenceExceptionstring[] result = text.Split(',');

nullの可能性がある場合は、事前に確認します。

if (!string.IsNullOrEmpty(text)){string[] result = text.Split(',');}

空配列を返す設計にする場合は、null条件演算子とnull合体演算子を組み合わせられます。

string[] result =text?.Split(',', StringSplitOptions.RemoveEmptyEntries)?? Array.Empty<string>();

また、分割後に想定した数の要素が存在するとは限りません。外部から受け取った文字列を処理するときは、インデックスへアクセスする前にLengthを確認することが重要です。

string input = "Tanaka";

string[] values = input.Split(',');

if (values.Length >= 2){Console.WriteLine(values[1]);}else{Console.WriteLine("必要な項目が不足しています。");}

このように、複数の区切り文字、空要素、前後の空白、null、要素数不足を考慮することで、予期しない例外が発生しにくいコードを作成できます。

まとめ

C#のSplitメソッドを使用すると、カンマ、スペース、タブ、改行などを基準に文字列を簡単に分割できます。戻り値はstring[]であり、分割後の要素はforeachやインデックスを使って取り出せます。

1文字の区切りにはchar、複数文字を1つの区切りとして扱う場合はstringを使用します。複数の1文字区切りを指定するときは、char配列を利用できます。

空の要素を除外するにはStringSplitOptions.RemoveEmptyEntries、各要素の前後にある空白を削除するにはStringSplitOptions.TrimEntriesが便利です。

string[] result = text.Split(new[] { ',', ';', '|' },StringSplitOptions.RemoveEmptyEntries |StringSplitOptions.TrimEntries);

一方で、対象文字列がnullの場合はNullReferenceException、存在しない配列要素へアクセスした場合はIndexOutOfRangeExceptionが発生する可能性があります。外部入力を処理する場合は、nullチェックや要素数の確認を行いましょう。

また、引用符を含むCSVなど、複雑な形式は単純なSplitだけでは正しく解析できないことがあります。データ形式に応じて、専用のパーサーやライブラリを使い分けることが大切です。

Splitはシンプルなメソッドですが、オプションやオーバーロードを理解すれば、さまざまな文字列分割処理を簡潔かつ安全に実装できます。