/ \ S / g ve / \ s + / g arasında bir fark var mı?


89

Boşluk karakterleri içeren bir dizeye sahip olduğumuzda:

var str = '  A B  C   D EF ';

ve dizeden boşlukları kaldırmak istiyoruz (bunu istiyoruz :) 'ABCDEF'.

İkisi de bu:

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

ve bu:

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

doğru sonucu döndürecektir.

Bu +, bu durumda gereksiz olduğu anlamına mı geliyor ? Bu durumda bu iki normal ifade arasında bir fark var mı (olduğu gibi, herhangi bir şekilde farklı sonuçlar üretebilirler mi)?


Güncelleme: Performans karşılaştırması - /\s+/gdaha hızlıdır. Buraya bakın: http://jsperf.com/s-vs-s


1
vidas stackoverflow.com/questions/5963182/… Bahse girerim bu soruyu sormanıza neden olan şey budur;) (yanıta ilişkin yorumunuz)
rsplak

2
Daha \s+hızlı olduğunu hayal edebiliyorum , çünkü beyaz boşluk yığınlarının yerini alabilirken, \sher beyaz boşluğu ayrı ayrı değiştirmek zorunda mı?
KooiInc

1
@KooiInc: Doğru, çünkü daha az eşleşiyor / değiştiriyor.
BoltClock

Yanıtlar:


219

İlk normal ifadede, her boşluk karakteri , karakter karakter boş dizeyle değiştirilir.

İkinci normal ifadede, her bitişik boşluk karakteri dizesi +,.

Bununla birlikte, 0'ın başka bir şeyle çarpılmasının 0 olması gibi, her iki yöntem de boşlukları tamamen aynı şekilde çıkarıyor gibi görünüyor.

Yerini alan dizeyi olarak değiştirirseniz, '#'fark çok daha net hale gelir:

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#

28

\s"bir boşluk" \s+anlamına gelir ve "bir veya daha fazla boşluk" anlamına gelir.

Ancak /gbayrağı kullandığınız için (tüm tekrarları değiştirin) ve boş dizeyle değiştirdiğiniz için, iki ifadeniz de aynı etkiye sahiptir.


Ancak ikinci versiyon muhtemelen daha hızlı olacak.
Tim Pietzcker

Bu, \ s +
Gaurav

1
@Gaurav: Hayır. Çünkü o zaman sadece ilkini değiştirir \s+, gerisini olduğu gibi bırakır. Örneğin, ' foo bar '.replace(/\s+/, '')size yalnızca 'foo bar '
argh

@Gaurav Sanmıyorum. gDeğiştiriciyi atlarsanız, beyaz boşluklardan oluşan bir bloğun yalnızca ilk geçtiği yer değiştirilecektir.
KooiInc

10

Bir eşleşme durumunda, ilki her boşluk için bir eşleşme döndürürken, ikincisi her beyaz boşluk grubu için bir eşleşme döndürecektir.

Sonuç aynıdır çünkü onu boş bir dizeyle değiştiriyorsunuz. Örneğin, 'x' ile değiştirirseniz, sonuçlar farklı olacaktır.

str.replace(/\s/g, '') 'xxAxBxxCxxxDxEF' döndürür

while str.replace(/\s+/g, '')'xAxBxCxDxEF' döndürür

çünkü \sher bir boşlukla eşleşir, her birini "x" ile değiştirir ve \s+beyaz boşluk gruplarını eşleştirerek birden çok sıralı beyaz boşluğu tek bir "x" ile değiştirir.


3

+"bir veya daha fazla karakter" anlamına gelir ve artı olmadan "bir karakter" anlamına gelir. Sizin durumunuzda her ikisi de aynı çıktıyla sonuçlanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.