4

コンマまたは空白を使用して文字列を分割しようとしています。必要に応じて、コンマの前および/または後に空白を付けることができ、空白自体も区切り文字としてカウントされます。コードは次のようになります。

var answers= s.split(/(\s*,\s*)|\s+/);

s文字列 'ab,c' が含まれている場合、予想される 3 つの項目ではなく、5 つの項目を含むリスト (配列) を取得します。

0:a、1:未定義、2:b、3:、4:c

私が間違っていることについてのアドバイスをいただければ幸いです。

フィリップ

4

4 に答える 4

12

これは、取得グルー​​プも結果配列にsplitプッシュするためです。

separator がキャプチャ用の括弧を含む正規表現である場合、separator が一致するたびに、キャプチャ用の括弧の結果 (未定義の結果を含む) が出力配列に結合されます。

との間のスペースが空白ab一致したため、キャプチャ グループは未定義でした。bとの間のカンマcはグループによって一致したため、配列の 4 番目の項目になりました。

この問題を解決するには、キャプチャ グループを削除するだけです。

var answers = s.split(/\s*,\s*|\s+/);

グループ化が必要なより複雑な式がある場合は、次のように非キャプチャにすることができます。

var answers = s.split(/(?:\s*,\s*)|\s+/);
于 2013-07-07T20:28:26.850 に答える
4

キャプチャ グループの内容が結果配列に追加されます。MDN ドキュメントから:

がキャプチャ用括弧を含む正規表現である場合separator、セパレータが一致するたびに、キャプチャ用括弧の結果 (未定義の結果を含む) が出力配列に結合されます。ただし、すべてのブラウザーがこの機能をサポートしているわけではありません。

非キャプチャ グループを使用します。

/(?:\s*,\s*)|\s+/
于 2013-07-07T20:27:27.473 に答える
2

かっこを削除するだけで機能します。

var s = 'a,b,c'
var answers = s.split(/\s*,\s*|\s+/);
// [ 'a', 'b', 'c' ]
于 2013-07-07T20:27:42.420 に答える
0

正規表現を使用すると、キャプチャ式(x)は一致を記憶します (そして、おそらくそれを に返しますString.split)。(非キャプチャ) グループ化式を使用する必要があります(?:x)。詳細については、たとえばRegExp に関する Mozilla Docs を参照してください。

于 2013-07-07T20:31:33.813 に答える