/ \ s / gと/ \ s + / gに違いはありますか?


87

スペース文字を含む文字列がある場合:

var str = '  A B  C   D EF ';

文字列からスペースを削除します(これが必要です:) 'ABCDEF'

この両方:

str.replace(/\s/g, '')

この:

str.replace(/\s+/g, '')

正しい結果を返します。

これ+は、この状況ではが不要であることを意味しますか?この状況では、これら2つの正規表現に違いはありますか(たとえば、何らかの方法で異なる結果が得られる可能性があります)?


更新:パフォーマンスの比較-/\s+/gより高速です。ここを参照してください:http//jsperf.com/s-vs-s


1
VIDASはstackoverflow.com/questions/5963182/...)答えに(コメント);私は、これはあなたがこの質問を作ったものである賭ける
rsplak

2
\s+空白のチャンクを置き換えることができるので、より高速であると想像できますが、\s各空白を個別に置き換える必要がありますか?
KooiInc

1
@KooiInc:一致/置換回数が少ないため、正解です。
BoltClock

回答:


214

最初の正規表現では、各スペース文字文字ごとに空の文字列に置き換えられています。

2番目の正規表現では、スペース文字の連続する各文字列が、+。のために空の文字列に置き換えられています。

ただし、0に他のものを掛けたものが0であるのと同じように、どちらの方法でもまったく同じ方法でスペースが削除されているように見えます。

置換文字列をに変更する'#'と、違いがより明確になります。

var str = '  A B  C   D EF ';
console.log(str.replace(/\s/g, '#'));  // ##A#B##C###D#EF#
console.log(str.replace(/\s+/g, '#')); // #A#B#C#D#EF#

27

\s「1つのスペース」を\s+意味し、「1つ以上のスペース」を意味します。

ただし、/gフラグを使用して(すべてのオカレンスを置き換える)、空の文字列に置き換えるため、2つの式の効果は同じです。


しかし、2番目のバージョンはおそらくより高速になります。
Tim Pietzcker

つまり、\ s +を使用している場合は/ gを使用する必要はありません
Gaurav

1
@Gaurav:いいえ。そうすると、最初のが置き換えられ\s+、残りはそのまま残ります。たとえば、' foo bar '.replace(/\s+/, '')あなただけ与えるだろう'foo bar ' 一つに二つのスペースを凝縮HTMLなんてこった編集
BoltClock

@Gauravそうは思いません。g修飾子を省略すると、空白のブロックの最初の出現のみが置き換えられます。
KooiInc

10

一致する状況では、最初の一致は空白ごとに1つの一致を返し、2番目の一致は空白の各グループの一致を返します。

空の文字列に置き換えるため、結果は同じです。たとえば、「x」に置き換えると、結果が異なります。

str.replace(/\s/g, '') 'xxAxBxxCxxxDxEF'を返します

whilestr.replace(/\s+/g, '')は 'xAxBxCxDxEF'を返します

なぜなら\s、各空白を一致させ、それぞれを「x」\s+に置き換え、空白のグループを一致させ、複数の連続する空白を単一の「x」に置き換えます。


3

+「1つ以上の文字」を意味し、プラスなしは「1文字」を意味します。あなたの場合、両方とも同じ出力になります。

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