Thay thế tất cả các ký tự không phải là Số Alpha, Dòng mới và nhiều khoảng trắng bằng một khoảng trắng


136

Tôi đang tìm một giải pháp RegEx gọn gàng để thay thế

  • Tất cả các ký tự không phải là số Alpha
  • Tất cả các NewLines
  • Tất cả nhiều trường hợp của khoảng trắng

Với một không gian duy nhất


Đối với những người chơi ở nhà ( sau đây không hoạt động )

text.replace(/[^a-z0-9]/gmi, " ").replace(/\s+/g, " ");

Suy nghĩ của tôi là RegEx có lẽ đủ mạnh để đạt được điều này trong một tuyên bố. Các thành phần tôi nghĩ rằng id cần là

  • [^a-z0-9] - để xóa các ký tự không phải là số Alpha
  • \s+ - phù hợp với bất kỳ bộ sưu tập không gian
  • \r?\n|\r - phù hợp với tất cả các dòng mới
  • /gmi - toàn cầu, đa dòng, không phân biệt chữ hoa chữ thường

Tuy nhiên, tôi dường như không thể tạo kiểu cho regex theo đúng cách (cách sau không hoạt động )

text.replace(/[^a-z0-9]|\s+|\r?\n|\r/gmi, " ");


Đầu vào

234&^%,Me,2 2013 1080p x264 5 1 BluRay
S01(*&asd 05
S1E5
1x05
1x5


Sản phẩm chất lượng

234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5

Làm thế nào chính xác là nỗ lực của bạn không hoạt động? Điều gì xảy ra sai?
Mũi nhọn

Câu trả lời:


235

Hãy nhận biết, để \W lại dấu gạch dưới . Một tương đương ngắn cho [^a-zA-Z0-9]sẽ là[\W_]

text.replace(/[\W_]+/g," ");

\Wlà sự phủ định của tốc \w cho các [A-Za-z0-9_]ký tự từ (bao gồm cả dấu gạch dưới)

Ví dụ tại regex101.com


Kiểm tra và kiểm tra nó, chưa có nhiều kinh nghiệm trong js-regex: p Chúc bạn thích nó
Jonny 5

6
Lưu ý rằng \Wcũng sẽ nhận ra các ký tự không phải là chữ Latinh là ký tự không phải từ.
Tyblitz

1
Tôi đã đánh dấu câu trả lời này chính xác sau tất cả những năm này, bởi vì tôi đã nhìn lại và người được chấp nhận đã không loại trừ dấu gạch dưới
TheGeneral

143

Jonny 5 đánh bại tôi với nó. Tôi sẽ đề nghị sử dụng \W+mà không có \snhư trong text.replace(/\W+/g, " "). Điều này bao gồm cả không gian màu trắng là tốt.


Cảm ơn @ T-CatSan đã chỉ ra điều đó! Mở đầu nó và Saruman, bạn có thể tự do thay đổi câu trả lời tốt nhất cho bất cứ điều gì :-) Nhưng nó nên \W+, không [W+]tốt, chúc mừng năm mới tất cả!
Jonny 5

Cảm ơn, @ Jonny5! Tôi đã thực hiện thay đổi mà bạn đề xuất. Tôi đã thử nghiệm với dấu ngoặc trước đây và bây giờ tôi thấy nó hoạt động mà không có chúng. Tôi cũng chúc mừng năm mới bạn nhé.
T-CatSan

1
hey @ T-CatSan có cách nào để thêm ngoại lệ không? Tôi muốn giữ nhân vật &-. Bất cứ lời khuyên?
Renato Gama

1
Tôi đã thực hiện thay đổi sau / (\ W +) | (_) / g để bỏ qua _ cũng được. Nhưng chỉ tự hỏi tại sao nó không bỏ qua trong mô hình đầu tiên và regex của tôi là mô hình hiệu quả.
Sridhar Gudimela

14

[^a-z0-9]lớp nhân vật chứa tất cả những gì không phải là alnum, nó cũng chứa các ký tự trắng!

 text.replace(/[^a-z0-9]+/gi, " ");

6

Vâng, tôi nghĩ rằng bạn chỉ cần thêm một bộ định lượng cho mỗi mẫu. Ngoài ra, điều trở lại vận chuyển là một chút buồn cười:

text.replace(/[^a-z0-9]+|\s+/gmi, " ");

sửa Các \strận đấu điều \r\nquá.


Vâng, có một số trò lừa bịp trong đó lượm lặt từ những câu trả lời khác về chủ đề này, tuy nhiên điều đó rất hiệu quả!
TheGeneral

2

A thấy một bài viết khác cũng có dấu phụ, đó là tuyệt vời

s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")


2

Đây là một bài viết cũ của tôi, hầu hết các câu trả lời được chấp nhận là tốt. Tuy nhiên tôi quyết định điểm chuẩn từng giải pháp và một giải pháp rõ ràng khác (chỉ để cho vui). Tôi tự hỏi liệu có sự khác biệt giữa các mẫu regex trên các trình duyệt khác nhau với các chuỗi có kích thước khác nhau.

Vì vậy, về cơ bản tôi đã sử dụng jsPerf trên

  • Thử nghiệm trong Chrome 65.0.3325 / Windows 10 0.0.0
  • Kiểm tra trong Edge 16.16299.0 / Windows 10 0.0.0

Các mẫu regex tôi đã thử nghiệm là

  • /[\W_]+/g
  • /[^a-z0-9]+/gi
  • /[^a-zA-Z0-9]+/g

Tôi đã tải chúng lên với độ dài chuỗi ký tự ngẫu nhiên

  • dài 5000
  • chiều dài 1000
  • chiều dài 200

Ví dụ javascript tôi đã sử dụng var newstr = str.replace(/[\W_]+/g," ");

Mỗi lần chạy bao gồm từ 50 mẫu trở lên trên mỗi regex và tôi chạy chúng 5 lần trên mỗi trình duyệt.

Hãy đua ngựa của chúng tôi!

Các kết quả

                                Chrome                  Edge
Chars   Pattern                 Ops/Sec     Deviation   Op/Sec      Deviation
------------------------------------------------------------------------
5,000   /[\W_]+/g                19,977.80  1.09         10,820.40  1.32
5,000   /[^a-z0-9]+/gi           19,901.60  1.49         10,902.00  1.20
5,000   /[^a-zA-Z0-9]+/g         19,559.40  1.96         10,916.80  1.13
------------------------------------------------------------------------
1,000   /[\W_]+/g                96,239.00  1.65         52,358.80  1.41
1,000   /[^a-z0-9]+/gi           97,584.40  1.18         52,105.00  1.60
1,000   /[^a-zA-Z0-9]+/g         96,965.80  1.10         51,864.60  1.76
------------------------------------------------------------------------
  200   /[\W_]+/g               480,318.60  1.70        261,030.40  1.80
  200   /[^a-z0-9]+/gi          476,177.80  2.01        261,751.60  1.96
  200   /[^a-zA-Z0-9]+/g        486,423.00  0.80        258,774.20  2.15

Sự thật được biết, Regex trong cả hai trình duyệt (có tính đến độ lệch) gần như không thể phân biệt được, tuy nhiên tôi nghĩ rằng nếu nó chạy được điều này thậm chí nhiều lần thì kết quả sẽ trở nên rõ ràng hơn một chút (nhưng không nhiều).

Tỷ lệ lý thuyết cho 1 ký tự

                            Chrome                        Edge
Chars   Pattern             Ops/Sec     Scaled            Op/Sec    Scaled
------------------------------------------------------------------------
5,000   /[\W_]+/g            19,977.80  99,889,000       10,820.40  54,102,000
5,000   /[^a-z0-9]+/gi       19,901.60  99,508,000       10,902.00  54,510,000
5,000   /[^a-zA-Z0-9]+/g     19,559.40  97,797,000       10,916.80  54,584,000
------------------------------------------------------------------------

1,000   /[\W_]+/g            96,239.00  96,239,000       52,358.80  52,358,800
1,000   /[^a-z0-9]+/gi       97,584.40  97,584,400       52,105.00  52,105,000
1,000   /[^a-zA-Z0-9]+/g     96,965.80  96,965,800       51,864.60  51,864,600
------------------------------------------------------------------------

  200   /[\W_]+/g           480,318.60  96,063,720      261,030.40  52,206,080
  200   /[^a-z0-9]+/gi      476,177.80  95,235,560      261,751.60  52,350,320
  200   /[^a-zA-Z0-9]+/g    486,423.00  97,284,600      258,774.20  51,754,840

Tôi sẽ không quan tâm nhiều đến những kết quả này vì đây không thực sự là một sự khác biệt đáng kể, tất cả những gì chúng ta thực sự có thể nói là cạnh chậm hơn: o. Ngoài ra, tôi đã rất chán.

Dù sao bạn có thể chạy điểm chuẩn cho chính mình.

Điểm chuẩn Jsperf tại đây


0

Để thay thế bằng dấu gạch ngang, hãy làm như sau:

text.replace(/[\W_-]/g,' ');
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.