web-dev-qa-db-ja.com

空白を含むJavaScript分割文字列

文字列を分割したいのですが、次のような空白を保持したいです:

var str = "my car is red";

var stringArray [];

stringArray [0] = "my";
stringArray [1] = " ";
stringArray [2] = "car";
stringArray [3] = " ";
stringArray [4] = "is";
stringArray [5] = " ";
stringArray [6] = "red";

それを行うにはどうすればいいですか?

ありがとう!

40
Jose

文字列を空白で分割してから追加し直すことができます。これは、各エントリの間にあることがわかっているためです。

var string = "text to split";
    string = string.split(" ");
var stringArray = new Array();
for(var i =0; i < string.length; i++){
    stringArray.Push(string[i]);
    if(i != string.length-1){
        stringArray.Push(" ");
    }
}

更新:末尾のスペースを削除しました。

42
somethinghere

正規表現を使用する:

var str   = "my car is red";
var stringArray = str.split(/(\s+)/);

console.log(stringArray); // ["my", " ", "car", " ", "is", " ", "red"] 

\sは空白である任意の文字に一致し、プラスを追加すると貪欲になり、文字で始まり空白で終わるグループに一致し、次のグループは空白の後に文字がある場合などに開始します。

61
chridam

Python langのような文字列をスペースで分割するには、次を使用できます。

   var w = "hello    my brothers    ;";
   w.split(/(\s+)/).filter( function(e) { return e.trim().length > 0; } );

出力:

   ["hello", "my", "brothers", ";"]

または類似:

   w.split(/(\s+)/).filter( e => e.trim().length > 0)

(出力する)

20
Dmitriy Yusupov

\bを使用して、Wordの境界で分割できます。 MDN を参照してください

「\ b:文字とスペースの間など、幅がゼロのワード境界に一致します。」

また、その後に空白\sが続くことを確認する必要があります。 "My car isn't red"のような文字列が引き続き機能するように:

var stringArray = str.split(/\b(\s)/);

複数のスペースを考慮するには、最初の\bが必要です。 my car is red

編集:グループ化を追加

7
Rhumborl
str.split(' ').join('§ §').split('§');
3
Esger

これはすべてのブラウザでサポートされているわけではありませんが、正規表現内でキャプチャ括弧を使用すると、キャプチャされた入力が結果に結合されます。

Separatorがキャプチャー括弧を含む正規表現である場合、セパレーターが一致するたびに、キャプチャー括弧の結果(未定義の結果を含む)が出力配列にスプライスされます。 [ 参照

そう:

var stringArray = str.split(/(\s+)/);
                             ^   ^
//

出力:

["my", " ", "car", " ", "is", " ", "red"]

これにより、元の入力の連続したスペースが折りたたまれますが、それ以外の落とし穴は考えられません。