Có sự khác biệt giữa / \ s / g và / \ s + / g không?


87

Khi chúng ta có một chuỗi chứa các ký tự khoảng trắng:

var str = '  A B  C   D EF ';

và chúng tôi muốn xóa các khoảng trắng khỏi chuỗi (chúng tôi muốn điều này 'ABCDEF':).

Cả điều này:

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

và điều này:

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

sẽ trả về kết quả chính xác.

Điều này có nghĩa +là không cần thiết trong tình huống này? Có sự khác biệt giữa hai biểu thức chính quy đó trong tình huống này không (như trong trường hợp này, chúng có thể tạo ra các kết quả khác nhau theo bất kỳ cách nào) không?


Cập nhật: So sánh hiệu suất - /\s+/gnhanh hơn. Xem tại đây: http://jsperf.com/s-vs-s


1
vidas stackoverflow.com/questions/5963182/… Tôi cá rằng đây là điều khiến bạn đặt câu hỏi này;) (bình luận của bạn về câu trả lời)
rsplak

2
Tôi có thể tưởng tượng \s+là nhanh hơn, vì nó có thể thay thế các khối khoảng trắng, trong khi \sphải thay thế từng khoảng trắng riêng biệt?
KooiInc

1
@KooiInc: Đúng, vì nó khớp / thay thế ít lần hơn.
BoltClock

Câu trả lời:


214

Trong regex đầu tiên, mỗi ký tự khoảng trắng sẽ được thay thế, từng ký tự, với chuỗi trống.

Trong regex thứ hai, mỗi chuỗi ký tự khoảng trắng liền kề sẽ được thay thế bằng chuỗi trống vì ký tự +.

Tuy nhiên, cũng giống như cách 0 nhân với bất kỳ thứ gì khác bằng 0, có vẻ như cả hai phương pháp tách các khoảng trắng theo cùng một cách.

Nếu bạn thay đổi chuỗi thay thế thành '#', sự khác biệt trở nên rõ ràng hơn nhiều:

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

\scó nghĩa là "một \s+khoảng trắng" và có nghĩa là "một hoặc nhiều khoảng trắng".

Tuy nhiên, vì bạn đang sử dụng /gcờ (thay thế tất cả các lần xuất hiện) và thay thế bằng chuỗi trống, hai biểu thức của bạn có cùng tác dụng.


Nhưng phiên bản thứ hai có thể sẽ nhanh hơn.
Tim Pietzcker

nó có nghĩa là, tôi không cần sử dụng / g nếu tôi đang sử dụng \ s +
Gaurav

1
@Gaurav: Không. Bởi vì sau đó nó sẽ chỉ thay thế cái đầu tiên \s+, còn lại nguyên vẹn. Ví dụ: ' foo bar '.replace(/\s+/, '')sẽ cung cấp cho bạn chỉ 'foo bar ' chỉnh sửa HTML argh ngưng tụ hai khoảng trắng thành một
BoltClock

@Gaurav Tôi không nghĩ vậy. Nếu bạn bỏ qua công cụ gsửa đổi, chỉ lần xuất hiện đầu tiên của khối khoảng trắng sẽ được thay thế.
KooiInc

10

Trong một tình huống đối sánh, đầu tiên sẽ trả về một kết quả phù hợp cho mỗi khoảng trắng, khi thứ hai sẽ trả về một kết quả phù hợp cho mỗi nhóm khoảng trắng.

Kết quả giống nhau vì bạn đang thay thế nó bằng một chuỗi trống. Nếu bạn thay thế nó bằng 'x' chẳng hạn, kết quả sẽ khác.

str.replace(/\s/g, '') sẽ trả về 'xxAxBxxCxxxDxEF'

while str.replace(/\s+/g, '')sẽ trả về 'xAxBxCxDxEF'

\sđối sánh từng khoảng trắng, thay thế từng khoảng trắng bằng 'x' và \s+khớp với các nhóm khoảng trắng, thay thế nhiều khoảng trắng tuần tự bằng một 'x'.


3

+có nghĩa là "một hoặc nhiều ký tự" và không có dấu cộng nghĩa là "một ký tự". Trong trường hợp của bạn, cả hai đều dẫn đến cùng một kết quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.