JavaScript文字列を空白またはカンマで区切るにはどうすればよいですか?


123

私がしようとすると

"my, tags are, in here".split(" ,")

私は以下を得ます

[ 'my, tags are, in here' ]

私が欲しいのに

['my', 'tags', 'are', 'in', 'here']

4
空白コンマを意味するのではないですか?
KaptajnKold

1
あなたが得ている結果の説明として:"my, tags are, in here".split(" ,")は、コンマが続くスペースセパレータである場合にのみ文字列を分割します。文字列にはそのシーケンスが含まれていないため、分割されません。 "my, tags are, in here".split(", ")分割シーケンスを交換すると、コンマとスペースの後に、元の文字列が少なくとも3つの部分に分割されます。5つの部分が必要な場合は、以下の回答で一致文字列をスペースまたはコンマに一致する正規表現として指定します。
Jochem Schulenklopper 2016

回答:


233

String.split 正規表現を受け入れることもできます:

input.split(/[ ,]+/);

この特定の正規表現は、1つ以上のコンマまたはスペースのシーケンスで分割されるため、たとえば、連続する複数のスペースやコンマ+スペースのシーケンスによって空の要素が結果に生成されません。


22
どう/,?\s+/ですか?
Bergi

4
@Bergi:まあ、それは私が提案するものよりも厳しく(前にカンマを1つだけ許可)、OPが要求するものよりも緩い(すべての空白で分割)。私見それはもっと悪いだろう-入力を考慮してくださいspaces , before commas
Jon

@ジョン:OK、それはOPのニーズに依存します。:-)
ベルギ

11
+1私はこれが少し古いことを知っていますが、なぜ空白ではなく空白を使用するのですか\s。blobに改行がある場合があり\sますが、それらも処理します。
iambriansreed 2012

6
FACEPALM注:正規表現を引用符で囲まないでください。例:使用しないでくださいinput.split("/[ ,]+/)"。(のinput.split(//)代わりにinput.split("//"))引用符を省略してください。そうすれば、はるかに優れたエクスペリエンスが得られます。奇妙なことに、それはおそらくそれ自体でのみ機能します(を生成するため["input.split(\"", ")\""])。
cod3monk3y 2013年

41

使用することをお勧めします.split(/[ ,]+/)が、自然な文では遅かれ早かれ配列の空の要素を取得することになります。例えば['foo', '', 'bar']

ユースケースに問題がなければ、どちらでもかまいません。しかし、もしあなたが空の要素を取り除きたいならば、あなたはすることができます:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);

6
これは、ネイティブオブジェクトの暗黙のコンストラクターの非常に賢い使用法です-私のコンピューターのキーボードは今朝怒っています-このコメントは後で編集します-'Boolean()'のようなBooleanを呼び出すと、[object Boolean]の新しいインスタンスが作成されます'new Boolean()'を呼び出すのと同じように、falseの値。これにより、すべての一致がこのデフォルトの動作までフィルターで除外されます。素敵な1つ:)
VLostBoy 2014

「自然な文章」とはどういう意味ですか?私はそれをエミュレートできず、これが何をすることになっているのか理解できません。
cregox 2017

@VLostBoyで説明されています。ときにBoolean()真または偽-コンストラクタが任意の値で呼び出され、それはブールにその値をキャストします。したがって、空の文字列を含むすべての偽の値が配列からフィルタリングされます。
jonschlinkert 2017

1
ところで、次のような他の同様の楽しいものには暗黙のコンストラクタを使用できます[1, 2, 3].map(String)
jonschlinkert

2
"foo, bar,,foobar,".split(/[\s,]+/)戻ります["foo", "bar", "foobar", ""](最後にぶら下がっているコンマがあるため)、ありがとうございます!
ラファウCieślak

37

あらゆる長さの空白をキャッチするために正規表現を使用できます。これは次のようになります。

var text = "hoi how     are          you";
var arr = text.split(/\s+/);

console.log(arr) // will result : ["hoi", "how", "are", "you"]

console.log(arr[2]) // will result : "are" 

を使用するときは、前後の空白に注意してください/\s+/。たとえば、'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ]。あなた.trim()が最初の文字列であれば、あなたは良いでしょう。
ジョーダンドドソン

12
"my, tags are, in here".split(/[ ,]+/)

結果は:

["my", "tags", "are", "in", "here"]

4

input.split(/\s*[\s,]\s*/)

\s*0個以上の空白文字(スペースだけでなく、タブや改行も)に一致します。

... [\s,]1つの空白文字または1つのコンマに一致します

のような入力からの空白要素を避けたい場合は、これでうまくいきます"foo,bar,,foobar"

input.split(/(\s*,?\s*)+/)

+直前の文字またはグループの一つ以上に一致します。

編集:

?ゼロまたは1つのコンマに一致するコンマの後に追加されます。

編集2:

編集1は間違いでした。修正しました。ここで、式が一致を見つけるために、少なくとも1つのコンマまたは1つのスペースが必要です。


いいえ。それは良いことではありません。これは出力です:["my"、 "tags are"、 "in here"]
ガビッシュ

キャラクターごとに分かれているようです。
Marco

@マルコおっと。たぶん、最後の編集をする前にテストしておくべきだったでしょう。私は今、そして今度は本当にうまくいくはずです。
KaptajnKold 2013年

うーん、これは受け入れられた答えよりどのように優れていますか?同様に"foo,bar,foobar".split(/[ ,]+/)戻ります["foo", "bar", "foobar"]
ラファウCieślak

1
@KaptajnKoldああ、聞き取れませんでした。回答ありがとうございます。
ラファウCieślak

2

コンマなどの余分な文字を考慮したい場合(私の場合、各トークンは引用符で入力できます)、string.replace()を実行して他の区切り文字を空白に変更し、空白で分割します。


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.