文を「、」で分割し、周囲のスペースを削除します


84

私はこのコードを持っています:

var r = /(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*){0,}$/
var s = "   a   ,  b  , c "
var m = s.match(r)
m => ["   a   ,  b  , c ", "a", "c"]

文字列全体が一致しているように見えますが、どこに"b"行ったのでしょうか。私はむしろ得ることを期待したい:

["   a   ,  b  , c ", "a", "b", "c"]

空白を削除したm.shift()ような結果で実行できるようにs.split(',')します。

正規表現に間違いがありString.prototype.matchますか、それとも誤解しますか?


ちなみに、はと{0,}同じ*です。
pimvdb 2011年

まあ、またはs' a, c''a,b,c d e, f'
意味

スペースを\ sに変更します
2011年

回答:


194

これは、複雑な正規表現を必要とせずにこれを行うための非常に単純で簡単な方法です。

var str = "   a   ,  b  , c "
var arr = str.split(",").map(function(item) {
  return item.trim();
});
//arr = ["a", "b", "c"]

ネイティブ.mapはIE9以降でサポートされていますhttps//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map


または、ES6 +ではさらに短くなります。

var arr = str.split(",").map(item => item.trim());

そして完成のために、ここに入力情報を含むTypescriptがあります

var arr: string[] = str.split(",").map((item: string) => item.trim());

4
ただ、好き嫌いあることを、あなたはマップ引数の周りにカッコを離れて行うことができます var arr = str.split(",").map(item=>item.trim());
デヴィッド・ジョーンズ

私はこれについて@DavidJonesと一緒にいます。あなたがあなたの答えを修正するならば、素晴らしいでしょう。私の場合、私を大いに助けてくれました、みんなありがとう!
すでに2017

うん良い点-それを反映するように回答が更新されました!私は通常Typescriptを書いているので、個人的には常に括弧を追加します。また、何かが一目でわかるように、明示的な型情報を提供するのが好きです。
CBarr 2017

これは素晴らしい答えですクリス。
周期的

シンプルで最高!!
RahulSonwanshi20年

23

複雑な正規表現なしでこれを試すことができます。

var arr = "   a   ,  b  , c ".trim().split(/\s*,\s*/);
console.log(arr);


17

簡単な答え:使用 m = s.match(/[^ ,]/g);


最後のグループが最新の一致(= c)と一致するため、REは期待どおりに機能しません。を省略する{1,}$と、返される一致はになります" a , b ", "a", "b"。つまり、フラグを使用しない限り、RegExpは指定されたグループと同じ数の一致を返します。この場合、返されるリストには、一致するすべての部分文字列への参照が含まれます。global/g

効果を得るには、次を使用します。

m = s.replace(/\s*(,|^|$)\s*/g, "$1");

この置換は、空白で囲まれたすべてのコンマ(,)、開始(^)、および終了($)を元の文字(comma、またはなし)に置き換えます。

配列を取得する場合は、次を使用します。

m = s.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/);

このREは、文字列をトリミングします(最初と最後のすべての空白を削除してから、文字列を分割します<any whitespace>,<any whitespace>。空白文字には改行とタブも含まれることに注意してください。スペースのみに固執する場合は、代わりにスペース()を使用してください。\s


@Andrew私はあなたのREの説明を拡張しました。splitメソッドについては、2番目の例を参照してください。
ロブW

私はすでに別の回答へのコメントとしてそれを投稿しました。1つの正規表現と1つの操作でそれを実行できますか、それともjs regexpは十分に賢くないのでしょうか?
蛇行2011年

@Andrewはい、使用してくださいs.match(/[^ ,]+/g)。私の答えの冒頭で述べたように/g、これはグローバルフラグであり、一致するすべての部分文字列を返します。
ロブW

@Andrew:追加する数量詞の数に関係なく、1つのキャプチャグループが1つの一致を作成します。あなたが一致する場合abそしてc、あなたは(含めない括弧の3組必要(?:...)):/(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*)$/
user123444555621

@ RobW、s.match(/ [^、] + / g)は必要に応じて正確に機能します。回答に追加してください
2011年


9

あなたはあなたの目的のためにこれを行うことができます
編集:コメントで提案されているように2番目の置換を削除します。 s.replace(/^\s*|\s*$/g,'').split(/\s*,\s*/)
最初replaceに文字列をトリミングしてから、split関数を分割し'\s*,\s*'ます。これにより["a", "b", "c"]、入力時に出力が得られます " a , b , c "

正規表現が「b」をキャプチャしない理由については、キャプチャされたグループを繰り返しているため、最後のオカレンスのみがキャプチャされます。詳細については、http://www.regular-expressions.info/captureall.htmlをご覧ください。


すべての空白を消去したくはありません。カンマの周囲または文字列の先頭/末尾のみを消去します
2011年

@Andrewは、すべての空白ではありませんか?または分割したい文がありますか?
David Hellsing 2011年

s.replace(/ ^ \ s * /、'').replace(/ \ s * $ /、'').split(/ \ s *、\ s * /)はこれを行うことができます
2011年

@Andrewあなたの要件に応じて答えを変更しました。
ナレンドラヤダラ2011年

7

だから最後に私は、/(?=\S)[^,]+?(?=\s*(,|$))/g必要なものを正確に提供する、を使用しました。すべての文は、周囲のスペースなしで「、」で分割されます。

'       a,    OMG     abc b a b, d o WTF        foo     '.
  match( /(?=\S)[^,]+?(?=\s*(,|$))/g )
=> ["a", "OMG     abc b a b", "d o WTF        foo"]

どうもありがとう!


これが私が理解している意味です。私が正しくない場合は訂正してください:(?=\S)-前に空白がない場合にのみキャプチャを開始します-[^,]+できるだけ多くの「非コンマ」をキャプチャします?-ただし、次のグループで(?=\s*(,|$))キャプチャできるものはキャプチャしないでください-前にすべての空白をキャプチャしますカンマまたは文字列の終わり/g-すべての文字列を繰り返します
2011年

2

正規表現を使い続けたい場合は、ES6を使用せずにコードを単純にしてください。

s.replace(/ /g, '').split(",")

1-すべてのスペース(/ / g)を空の文字列( '')に置き換えます

2-次にそれを配列に分割します

Et voila


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