Apakah ada perbedaan antara / \ s / g dan / \ s + / g?

89

Ketika kita memiliki string yang berisi karakter spasi:

var str = '  A B  C   D EF ';

dan kami ingin menghapus spasi dari string (kami ingin ini 'ABCDEF':).

Keduanya ini:

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

dan ini:

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

akan mengembalikan hasil yang benar.

Apakah ini berarti bahwa +tidak berguna dalam situasi ini? Apakah ada perbedaan antara kedua ekspresi reguler tersebut dalam situasi ini (seperti dalam, dapatkah keduanya memberikan hasil yang berbeda)?


Pembaruan: Perbandingan kinerja - /\s+/glebih cepat. Lihat di sini: http://jsperf.com/s-vs-s

Šime Vidas
sumber
1
vidas stackoverflow.com/questions/5963182/… Saya yakin inilah yang membuat Anda mengajukan pertanyaan ini;) (komentar Anda atas jawabannya)
rsplak
2
Bisa saya bayangkan \s+lebih cepat, karena dapat menggantikan potongan-potongan whitespace, sementara \sharus mengganti setiap white space secara terpisah?
KooiInc
1
@KooiInc: Benar, karena lebih sedikit cocok / menggantikan.
BoltClock

Jawaban:

219

Di regex pertama, setiap karakter spasi diganti, karakter demi karakter, dengan string kosong.

Di regex kedua, setiap string karakter spasi yang berdekatan diganti dengan string kosong karena +.

Namun, seperti bagaimana 0 dikalikan dengan apa pun adalah 0, tampaknya kedua metode tersebut menghapus spasi dengan cara yang persis sama.

Jika Anda mengubah string pengganti menjadi '#', perbedaannya menjadi lebih jelas:

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#
BoltClock
sumber
28

\sberarti "satu spasi", dan \s+berarti "satu atau lebih spasi".

Namun, karena Anda menggunakan /gbendera (mengganti semua kejadian) dan menggantinya dengan string kosong, kedua ekspresi Anda memiliki efek yang sama.

Balapan Ringan dalam Orbit
sumber
Tapi versi kedua mungkin akan lebih cepat.
Tim Pietzcker
apakah itu berarti, saya tidak perlu menggunakan / g jika saya menggunakan \ s +
Gaurav
1
@Gaurav: Tidak. Karena itu hanya akan menggantikan yang pertama \s+, membiarkan sisanya utuh. Misalnya, ' foo bar '.replace(/\s+/, '')Anda hanya akan 'foo bar ' mengedit HTML argh yang memadatkan dua spasi menjadi satu
BoltClock
@Gaurav Kurasa tidak. Jika Anda menghilangkan gpengubah, hanya kemunculan pertama dari blok spasi putih yang akan diganti.
KooiInc
10

Dalam situasi pertandingan yang pertama akan mengembalikan satu pertandingan per spasi, ketika yang kedua akan mengembalikan pertandingan untuk setiap grup spasi putih.

Hasilnya sama karena Anda menggantinya dengan string kosong. Jika Anda menggantinya dengan 'x' misalnya, hasilnya akan berbeda.

str.replace(/\s/g, '') akan mengembalikan 'xxAxBxxCxxxDxEF'

sementara str.replace(/\s+/g, '')akan mengembalikan 'xAxBxCxDxEF'

karena \smencocokkan setiap spasi, mengganti setiap spasi dengan 'x', dan \s+mencocokkan grup spasi, mengganti beberapa spasi putih berurutan dengan satu 'x'.

Doug
sumber
3

+berarti "satu atau lebih karakter" dan tanpa plus berarti "satu karakter." Dalam kasus Anda, keduanya menghasilkan keluaran yang sama.

Josh M.
sumber