Замените все не буквенно-цифровые символы, новые строки и несколько пробелов одним пробелом


136

Я ищу отличное решение RegEx для замены

  • Все не буквенно-цифровые символы
  • Все NewLines
  • Все несколько экземпляров белого пространства

С единым пространством


Для тех, кто играет дома (работает следующее )

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

Я думаю, что RegEx , вероятно, достаточно мощен, чтобы добиться этого одним оператором. Я думаю, что id нужны компоненты:

  • [^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 Рад, что вам это нравится
Джонни 5

6
Обратите внимание, что \Wнелатинские символы также распознаются как символы, отличные от слов.
Tyblitz

1
Я отметил этот ответ правильным после всех этих лет, потому что я оглянулся назад, и принятый не исключает подчеркивания
TheGeneral

143

Джонни 5 опередил меня. Я собирался предложить использовать \W+без \sas in text.replace(/\W+/g, " "). Это также покрывает пустое пространство.


Спасибо @ T-CatSan за указание на это! Поднял его, и Саруман, ты можешь изменить лучший ответ на что угодно :-) Но так и должно быть \W+, а не [W+]Что ж, с новым годом всех!
Джонни 5,

Спасибо, @ Jonny5! Я внес предложенное вами изменение. Раньше я тестировал скобки, и теперь вижу, что они работают без них. И тебя с Новым годом.
T-CatSan 01

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тоже.


Да, там было какое-то дурачество, почерпнутое из других ответов по этой теме, однако это отлично работает, спасибо!
TheGeneral 01

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 здесь


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.