String.Split操作で空白を指定する最良の方法


242

次のように、空白に基づいて文字列を分割しています。

string myStr = "The quick brown fox jumps over the lazy dog";

char[] whitespace = new char[] { ' ', '\t' };
string[] ssizes = myStr.Split(whitespace);

char []配列をコード内のどこにでも定義するのは面倒です。文字配列の作成を必要としないより効率的な方法はありますか(別の場所にコピーするとエラーが発生しやすくなります)?


1
これを行います:myStr.Split( ''); うまくいかない?
woolagaroo、

4
私がこれを正しく理解していれば、これはスペースのみを検索し、一般的な空白は検索しません

重複の可能性も参照してください。ただし、これらの後半の回答にはSplitStringOptionsがあります。stackoverflow.com/questions/1562981/...
goodeye

回答:


469

あなただけを呼び出す場合:

string[] ssize = myStr.Split(null);

または:

string[] ssize = myStr.Split(new char[0]);

次に、空白文字が分割文字と見なされます。以下からのstring.Split(char[])メソッドのドキュメントページ

セパレータパラメータがnull文字であるか、文字を含まない場合、空白文字が区切り文字と見なされます。空白文字はUnicode標準で定義されておりtrueChar.IsWhiteSpaceメソッドに渡された場合に返されます。

常に、常に、常にドキュメントを読んでください!


2
空白で分割する際の問題は、もう一度組み合わせる必要がある場合、戻す空白文字がわからないことです。
ロスプレッサー

19
(char[])null新しいオブジェクトの作成を回避するため、わずかに優れています。(nullどのoptionsオーバーロードでも使用できません)。
Artfunkel 2013

5
@RossPresser:文字列を元に戻すのはまったく別の問題なので、これが問題であるとは言えません。ただし、文字列を元の状態に戻すだけの場合は、元の文字列を保持することをお勧めします。
stakx-2013年

4
ばかげた質問ですが、を使用nullする場合でも、を指定する必要がありますか、StringSplitOption.RemoveEmptyEntriesそれともデフォルトで無視されますか?
yu_ominae 2013

2
@RossPresser:String.Splitは、文字列を分割するために使用される文字を追跡するメカニズムを提供しないため、観察は関係ありません。String.Splitを使用して求めるものを達成できないため、別のQ&Aが必要です。
ToolmakerSteve、2015年

207

はい、もう1つ回答が必要です。

すべてのソリューションは、これまでのかなり限定されたドメイン対処する標準的な入力をウィットに、:単一の空白文字の間(少なくとも問題に言及するため@chernoへの帽子の先端が)の要素を。しかし、私はほとんどの不明瞭なシナリオを除いてすべてを提出します、これらすべてを分割すると同じ結果得られるはずです:

string myStrA = "The quick brown fox jumps over the lazy dog";
string myStrB = "The  quick  brown  fox  jumps  over  the  lazy  dog";
string myStrC = "The quick brown fox      jumps over the lazy dog";
string myStrD = "   The quick brown fox jumps over the lazy dog";

String.Split(他の回答でここに示されているフレーバーのRemoveEmptyEntriesいずれかで)、これらのいずれかでオプションをアタッチしない限り、単にうまく機能しません:

myStr.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)
myStr.Split(new char[] {' ','\t'}, StringSplitOptions.RemoveEmptyEntries)

図からわかるように、オプションを省略すると、4つの異なる結果(A、B、C、およびDのラベルが付けられます)と、使用時の4つの入力すべてからの単一の結果が得られますRemoveEmptyEntries

String.Split対Regex.Split

もちろん、オプションを使用したくない場合は、代わりに正規表現を使用してください:-)

Regex.Split(myStr, @"\s+").Where(s => s != string.Empty)

4
@RossPresser、それは「最も不明瞭なシナリオ以外のすべてのシナリオの下で」私の修飾子でカバーされていると思います。なぜなら、要素を再結合したいときでさえ、複数のスペースを気にする場合がありがたいからです。私は標準的な形が欲しいです-それぞれの間に1つのスペース。したがって、私は敬意を払って同意しません。「通常は間違っている」というよりは「まれに間違っている」でしょう。
Michael Sorens 2013

1
CapitalizeEveryWord("This is line one.\n \nThis is line three.")
ロスプレッサー2013

3
これが曖昧であると本当に思うなら、私たちは同意しないことに同意する必要があると思いますが、私がこの機能を私のソフトウェアから外した場合、私は仕事を失うでしょう。ユーザーは、自分のコンテンツが自分の望む形に見えることを好みます。
ロスプレッサー2013

4
これははるかに完全であるため、これは受け入れられる答えになるはずです。
デニス

1
なぜ.Where(s => s != string.Empty)Regexに追加したのかと思います。\s+(任意の数のスペース)を指定するので、間に空の項目があってはなりません。
ジャックミラー

44

ドキュメントによると:

separatorパラメータがnullであるか、文字が含まれていない場合、空白文字が区切り文字と見なされます。空白文字はUnicode標準で定義されており、Char.IsWhiteSpaceメソッドに渡されるとtrueを返します。

したがってmyStr.Split();セパレーターparams配列なので、何も渡す必要はありません。


11

なぜ使用しないのですか?:

string[] ssizes = myStr.Split(' ', '\t');

2
2文字を使用するSplitオーバーロードはありません。
takrl

1
@takrl:ここを見てください public string [] Split(params char [] separator).NET v2
Renatas M.

はい、これは文字配列を取ります。コードスニペットは2つの単一文字を渡します。
takrl、

15
@takrl:paramsキーワードが何か知っていますか???
Renatas M.

かなりクールで、+ 1です。おそらく、反対票を投じた人も知りませんでした。
takrl、

3

を使用する場合でも、隣接する空白は単一の区切り文字として扱われないことに注意してくださいString.Split(null)。トークンのいずれかが複数のスペースまたはタブで区切られている場合、配列に空の文字列が返されます。

ドキュメントから:

separatorの各要素は、個別の区切り文字を定義します。2つの区切り文字が隣接している場合、またはこのインスタンスの先頭または末尾に区切り文字が見つかった場合、対応する配列要素には空が含まれます。


2

だからコピーして貼り付けないでください!関数を抽出して分割を行い、再利用します。

public static string[] SplitWhitespace (string input)
{
    char[] whitespace = new char[] { ' ', '\t' };
    return input.Split(whitespace);
}

コードの再利用はあなたの友人です。



1

あなたは使うことができます

var FirstString = YourString.Split()。First();

文字列を分割する。


0

インラインでできないの?

var sizes = subject.Split(new char[] { ' ', '\t' });

それ以外の場合、この正確なことを頻繁に行うと、常に定数またはそのchar配列を含む何かを作成できます。

他の人が指摘しているように、ドキュメントによれば、nullまたは空の配列を使用することもできます。これを行うと、空白文字が自動的に使用されます。

var sizes = subject.Split(null);

0

同じコードを繰り返すことが問題である場合は、分割ロジックをカプセル化する拡張メソッドをStringクラスに記述します。


1
これは実際には質問の答えにはなりません。
p.campbell 2013

p。キャンベル:はい、そうです:OPは、文字配列をどこにでもコピーする必要がないソリューションを求めました。明白な解決策は、タスクを実行する関数を作成することです。この回答は、そのような関数が拡張メソッドである可能性があることを指摘しています。(答えは、そうするためのコードを示すことで改善できます...)
ToolmakerSteve

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.