C#で文字列を別の文字列で分割する


681

Split()文字列を分割する方法を使用してきましたが、これは、文字列を文字で分割している場合にのみ機能するようです。を分割する方法はありstringますか?別の文字列がパラメーターで分割されていますか?

私はスプリッターを文字配列に変換しようとしましたが、うまくいきませんでした。

言い換えれば、私は分割したいと思いますstring

THExxQUICKxxBROWNxxFOX

xx、値の配列を返します。

THE、QUICK、BROWN、FOX


2
将来の懸念について:以下のコメントの1つが私に興味を持ったので、受け入れられた回答でそれを行うための直感的でない(しかし正しい)方法に関してソフトウェアエンジニアリングについての議論を開くことにしました。
scharette

回答:


1238

文字列で分割するには、文字列配列のオーバーロードを使用する必要があります。

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);

4
私は実際には2つの理由でこれに対する私の答えを変更してしまいました。#1:分割を処理するには、分割文字列にアスタリスクなどが含まれることが多いため、Regex.Escapeを使用する必要があります。#2:このプログラム私が書いているのは、実際の最適化は必要ありません。RegexSplitメソッドの使用に伴う追加のオーバーヘッドがあるようです。
ブランドン

7
@ピーター:その投稿では、ジョンはそれを提案しています。ポスターには固定の区切り文字がないからです。彼は「2つ以上のスペース」(2つ以上の意味)で区切られた文字列を分割しようとしています。ではなくパターンで区切られた文字列の場合、RegExは優れた(まあ、唯一の)オプションです。固定値区切り文字の場合、不要なオーバーヘッドが発生します。テストを実行してみてください。操作の数が増えると、RegExは対応するものの約10倍程度かかりますstring.Split
Adam Robinson

9
私はPythonからC#に移行しました。Pythonは、別の文字列による文字列分割をサポートしています。そして、私は頻繁にこの質問に戻って、への簡単な答えを求めなければなりstring[] Split(string pattern)ません。これは、私が考えることができる最も自然な使用法ですが、まだありません。以前にCを書いたので、配列をcharすることに慣れていますがchar[]、C#コードでポップアップが表示されるのを嫌います。ストリームレベルからバイトレベルに突然注意を引き付けるためです。C#ライブラリの人たちがSplitメソッドをこのように設計した理由を誰かが知っていますか?正当な理由があれば、ご不便をおかけして申し訳ありません。
foresightyj 2015年

11
このスニペットは、C#以外の開発者に見せることを恥ずかしく思うもののリストで非常に上位にランクされています。
Traubenfuchs、2015年

98
なぜ地獄は私たちだけではできないのdata.Split("xx")ですか?
mcont

122

文字列を受け取るスプリットのオーバーロードがあります。

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);

これらのStringSplitOptionsのいずれかを使用できます

  • なし -戻り値には、空の文字列を含む配列要素が含まれます
  • RemoveEmptyEntries-戻り値には、空の文字列を含む配列要素は含まれません

したがって、文字列が「THExxQUICKxxxxBROWNxxFOX」の場合StringSplitOptions.None、「xxxx」部分の配列に空のエントリが返されますが、返されStringSplitOptions.RemoveEmptyEntriesません。


73
Regex.Split(string, "xx")

私がいつもやるやり方です。


もちろん、次のものが必要です。

using System.Text.RegularExpressions;

または:

System.Text.RegularExpressions.Regex.Split(string, "xx")

しかし、それでもまた、そのライブラリは常に必要です。


13
@ブランドン:私は通常、時期尚早の最適化に対して警告していますが、正規表現のオーバーヘッドのため、RegEx.Splitaは単純なものよりもかなりコストがかかることに注意してくださいString.Split
Adam Robinson

9
任意の文字列で分割する場合Regex.Escapeは、最初に文字列で使用すると、正規表現のメタ文字がエスケープされます。
リチャード

オーバーヘッドを支払う可能性がある主な利点の1つは、文字列比較設定を提供できることです
Timur Sadykov


25

私は一般的にそれのために自分の拡張を使いたいです:

string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE  QUICK  BROWN  FOX 


//the extension class must be declared as static
public static class StringExtension
{   
    public static string[] Split(this string str, string splitter)
    {
        return str.Split(new[] { splitter }, StringSplitOptions.None);
    }
}

ただし、Microsoftがこのメソッドオーバーロードを以降のバージョンに含めることを決定した場合は、例外が発生します。マイクロソフトが当面この方法を採用しなかった理由としても考えられます。私が働いていた少なくとも1つの会社が、そのような拡張機能をすべてのC#プロジェクトで使用していました。

メソッドが存在しない場合は、実行時に条件付きでメソッドを定義することもできます。


4
または、params string[] splitter2番目のパラメーターとして使用し、複数の区切り文字をサポートするnew[] {splitter}ようsplitterに変更します。
マシューStrawbridge 2014年

10

以前の答えはすべて正しいです。私はさらに一歩進んで、Stringで拡張メソッドを定義することでC#を機能させます。

public static class Extensions
{
    public static string[] Split(this string toSplit, string splitOn) {
        return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
    }
}

そうすれば、初めてこれを達成しようとしたときに単純に予想した単純な方法で、任意の文字列でそれを呼び出すことができます。

"a big long string with stuff to split on".Split("g str");


7
string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');

置換文字を慎重に選択するだけです(既に文字列に含まれている可能性が低い文字を選択してください)。


2
@MasoudHosseini:完全な回答を読んでください。すでに免責事項があります。
SNag

3
@神戸:ひどいハックだから。
2015年

3
正常に動作しますが、ジェネリックメソッドにとって危険です
Kaizonaro

5
「ひどいハックだ」「悪い答えだ」などの説明を投稿しても役に立たない。説明のない意見です。代わりに、「置換のために文字列をスキャンしてから、分割された文字をスキャンする必要はありません。パフォーマンスが低下するためです。」あなた自身を説明するより良い方法でしょう。あまりにも多くのプログラマーがこのように行動します。:(
マットRuwe

1
文字列に|すでに文字が含まれている場合はどうなりますか?このため、使用するのは危険だと思います。
amd 2018年

-1

これも簡単です。

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

1
しかし、これは分割"THExQUICK"したくない場所でも分割されます
Rafalon

ラファロンに感謝:はい、グレッグが最善の答えです:data.Split(new string [] {"xx"}、
StringSplitOptions.RemoveEmptyEntries

-4

最も簡単な方法は以下を使用することString.Replaceです:

string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");

またはもっと簡単に:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");

3
現状では、これは(質問が要求するように)配列を返さず、xx'があった場所にコンマを含む文字列だけを返します。
Arj

さらに、文字列に追加のカンマが含まれている場合、単語を正しく分割することができません。
user3658298
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.