Замініть усі символи, що не належать до альфа-чисел, нові рядки та кілька пробілів на один пробіл


136

Я шукаю акуратне рішення RegEx для заміни

  • Усі символи, що не містять альфа-чисел
  • Усі нові лінії
  • Усі множинні екземпляри пробілу

З єдиним пробілом


Для тих, хто грає вдома ( далі працює )

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

Я думаю, що RegEx , ймовірно, досить потужний, щоб досягти цього в одному твердженні. Компоненти, які я думаю, мені потрібні

  • [^a-z0-9] - для видалення символів, що не належать до цифр
  • \s+ - відповідати будь-яким колекціям пробілів
  • \r?\n|\r - відповідати всім новим рядком
  • /gmi - глобальний, багатолінійний, нечутливий до регістру

Однак я не можу, мабуть, правильно стилізувати регулярний вираз ( наступне не працює )

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


Вхідні дані

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


Бажаний вихід

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

Як саме ваша спроба не працює? Що піде не так?
Pointy

Відповіді:


235

Будьте в курсі, що \W залишає підкреслення . Короткий еквівалент [^a-zA-Z0-9]буде[\W_]

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

\W- це заперечення скорочень \w для [A-Za-z0-9_]символів слова (включаючи підкреслення)

Приклад на сайті regex101.com


Перевірте і протестуйте, ще не маєте великого досвіду роботи у js-regex: p Щасливий, що вам це подобається
Jonny 5

6
Зауважте, що \Wтакож непізнавальні символи будуть розпізнаватися як символи без слів.
Тиблиця

1
Я відповів цією відповіддю правильною після всіх цих років, тому що я озирнувся назад і прийняте не виключало підкреслень
Загальне

143

Джоні 5 побив мене до цього. Я збирався запропонувати використовувати \W+без, \sяк в text.replace(/\W+/g, " "). Це охоплює і білий простір.


Дякуємо @ T-CatSan за вказівку на це! Нагору, і Саруман, ти вільний змінити найкращу відповідь на що завгодно :-) Але це повинно бути \W+, не [W+]ну, щасливого нового року всім!
Іоні 5

Дякую, @ Jonny5! Я вніс запропоновану вами зміну. Раніше я тестував дужки і тепер бачу, що це працює і без них. З новим роком і вам.
T-CatSan

1
Ей @ T-CatSan чи є спосіб додати винятки? Я хочу зберегти символів &і -. Якісь поради?
Ренато Гама

1
Я змінив / (\ W +) | (_) / g, щоб також ігнорувати _. Але просто цікаво, чому це не ігнорується в першій моделі, і мій регекс є ефективним.
Шрідхар Гудімела

14

Оскільки [^a-z0-9]клас символів містить все те, що не є alnum, він містить і білі символи!

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

6

Ну, я думаю, що вам просто потрібно додати кількісний показник до кожного шаблону. Крім того, річ, що повертає вагон - трохи смішна:

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

редагувати The \sріч матчі \rі \nтеж.


Так, там був якийсь фоллелер, зібраний з інших відповідей на цю тему, однак це чудово дякує!
Загальний

2

Бачив інший пост, який також мав діакритичні позначки, що чудово

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


2

Це моя стара публікація, прийняті відповіді здебільшого хороші. Однак я вирішив порівняти кожне рішення та ще одне очевидне (просто для задоволення). Мені було цікаво, чи є різниця між шаблонами регулярних виразів у різних браузерах з різними розмірами рядків.

Тому в основному я використовував JSPerf на

  • Тестування в Chrome 65.0.3325 / Windows 10 0.0.0
  • Тестування в Edge 16.16299.0 / Windows 10 0.0.0

Випробувані нами схеми регексу

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

Я завантажив їх довжиною рядків випадкових символів

  • довжина 5000
  • довжина 1000
  • довжина 200

Приклад javascript я використав var newstr = str.replace(/[\W_]+/g," ");

Кожен запуск складався з 50 або більше зразків на кожному регулярному виразі, і я запускав їх 5 разів у кожному браузері.

Давайте біжимо на наших конях!

Результати

                                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

Правда відомо, що Regex в обох браузерах (беручи до уваги відхилення) майже не відрізнялися, проте я думаю, якби це запустити ще більше разів, результати стануть трохи чіткішими (але не набагато).

Теоретичне масштабування для 1 символу

                            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

Я б не брав особливих зусиль у цих результатах, оскільки це насправді не є суттєвими відмінностями, все, що ми можемо реально сказати, є краєм повільніше: o. До того ж мені було супер нудно.

У будь-якому випадку ви можете запустити орієнтир для себе.

Jsperf Benchmark тут


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.