Удалите все специальные символы с RegExp


234

Я хотел бы RegExp, который удалит все специальные символы из строки. Я пытаюсь что-то вроде этого, но это не работает в IE7, хотя это работает в Firefox.

var specialChars = "!@#$^&%*()+=-[]\/{}|:<>?,.";

for (var i = 0; i < specialChars.length; i++) {
  stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}

Подробное описание RegExp также будет полезно.


18
Примерно так было бы лучше в виде белого списка, а не черного списка. тогда вы могли бы просто сделать [az] | [0-9] | \ s
Ape-inago

Любая ошибка сценария? Вы отлаживали? Или же вставьте блок try ... catch в код JavaScript.
Канкан

@ Обезьяна, не могли бы вы объяснить RegExp немного больше мне, пожалуйста
Тимоти Рул

3
Пожалуйста, определите «специальный символ»! "風" специально для тебя? (Думая об этом, вы увидите точку зрения @ Ape-iango.)
deceze

7
Я не думаю, что кто-то здесь имел в виду какое-либо оскорбление. Я сгорел раньше, делая это как черный список, так как всегда есть те маленькие "ошибки", которые заканчивают тем, что заканчивали (как примеры deceze). В конечном итоге правильный подход - больше о том, почему вы пытаетесь это сделать.
Обезьяна

Ответы:


614
var desired = stringToReplace.replace(/[^\w\s]/gi, '')

Как уже упоминалось в комментариях, это проще сделать в виде белого списка - замените символы, которых нет в вашем безопасном списке.

Символ caret ( ^) - это отрицание множества [...], giскажем, глобального и без учета регистра (последний немного избыточен, но я хотел бы упомянуть об этом), а в этом примере списком надежных отправителей являются цифры, символы слова, подчеркивания ( \w) и пробел ( \s).


50
Это решение не работает для не английских символов. «Їжак» например.
Чайка

4
Вы также можете использовать заглавные буквы \ W вместо ^ \ w. \ W: Соответствует любому несловесному символу. Эквивалентно [^ A-Za-z0-9_]. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/… ..
delkant

@ Чайка Я добавил ответ, который обрабатывает Unicodes.
freedev

1
для акцентирования слов, как в португальском языке, сделайте это: stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
alansiqueira27

1
Чтобы добавить большинство европейских языков (норвежский, шведский, немецкий, португальский, испанский) stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). Для включения других языков можно использовать диапазоны юникода. См .: stackoverflow.com/questions/150033/…
Эскиль Мьелва Саатведт

105

Обратите внимание, что если вы все еще хотите исключить набор, включая такие элементы, как косая черта и специальные символы, вы можете сделать следующее:

var outString = sourceString.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');

обратите особое внимание, что для того, чтобы включить символ «минус», вам необходимо экранировать его с обратной косой чертой, как у последней группы. если вы этого не сделаете, он также выберет 0-9, что, вероятно, нежелательно.


10
отличное решение! Принятый ответ работает только на английском языке, это работает на любых языках (насколько я проверял). спасибо :)
Ронен Несс

1
@knutole удалите ?часть набора символов вперед. в этом списке перечислены символы, которые вы хотите удалить, поэтому исключение их из удаления будет включать их в окончательный результат.
noinput

Это прекрасно работает, идеально подходит для любого языка, просто нужно добавить символ, который вы хотите заменить, и все. Спасибо.
Элрос Ромео

21

Простое регулярное выражение Javascript не обрабатывает буквы Unicode .

Не используйте [^\w\s], это приведет к удалению букв с акцентом (например, àèéìòù), не говоря уже о кириллице или китайском, буквы, приходящие с таких языков, будут полностью удалены.

Вы действительно не хотите удалять эти буквы вместе со всеми специальными символами. У вас есть два шанса:

  • Добавить в своем регулярном выражении все специальные символы , которые вы не хотите удалить,
    например: [^èéòàùì\w\s].
  • Посмотрите на xregexp.com . XRegExp добавляет базовую поддержку для сопоставления Юникода через \p{...}синтаксис.

var str = "Їжак::: résd,$%& adùf"
var search = XRegExp('([^?<first>\\pL ]+)');
var res = XRegExp.replace(str, search, '',"all");

console.log(res); // returns "Їжак::: resd,adf"
console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf"
console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>


3
Полезно знать об интернационализации, я понятия не имел, что регулярное выражение JS не было UTF-8.
LessQuesar

Вы не можете поместить все действительные буквы UTF-8 в var str
Seagull

@Seagull - да, но если вы не пишете совместимое по всему миру приложение, вы можете прагматично разместить только список допустимых букв UTF-8 для ваших текущих локализаций. В моем случае для итальянского языка букв мало.
freedev

7

Первое решение не работает для любого алфавита UTF-8. (Это будет вырезать текст, такой как Їжак). Мне удалось создать функцию, которая не использует RegExp и использует хорошую поддержку UTF-8 в движке JavaScript. Идея проста, если символ равен в верхнем и нижнем регистре, это специальный символ. Единственное исключение сделано для пробелов.

function removeSpecials(str) {
    var lower = str.toLowerCase();
    var upper = str.toUpperCase();

    var res = "";
    for(var i=0; i<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

Обновление: обратите внимание, что это решение работает только для языков, где есть маленькие и заглавные буквы. На таких языках, как китайский, это не сработает.

Обновление 2: я пришел к исходному решению, когда работал над нечетким поиском. Если вы также пытаетесь удалить специальные символы для реализации функции поиска, есть лучший подход. Используйте любую библиотеку транслитерации, которая выдаст вам строку только из латинских символов, а затем простой Regexp сделает всю магию удаления специальных символов. (Это будет работать и для китайцев, и вы также получите дополнительные преимущества, сделав Tromsø== Tromso).


Отлично, как этот ответ! Я использую его для создания правильного имени файла, и оно расширило ваше решение, чтобы убрать пробелы (совместимые с Linux / Unix) и разрешить номера. Поэтому я расширил оператор if (задействован jQuery): if (str [i]! == '' && (lower [i]! = Upper [i] || lower [i] .trim () === '' | | $ .isNumeric (str [i])))
Джонни

во многих языках нет заглавных букв ... поэтому функция будет считать допустимый ввод в качестве специальных символов
Яир Леви

Китайские иероглифы - один из примеров, который этим лишен
lethek

Когда я создавал это решение, к сожалению, я не думал о таких языках, как китайский. Решение должно быть предложено, так как предыдущие ответы также не будут работать.
Чайка

1

Я использую RegexBuddy для отладки своих регулярных выражений, так как почти все языки очень полезны. Чем копировать / вставить для целевого языка. Потрясающий инструмент и не очень дорогой.

Поэтому я скопировал / вставил ваше регулярное выражение, и ваша проблема заключается в том, что [,] являются специальными символами в регулярном выражении, поэтому вам нужно избегать их. Таким образом, регулярное выражение должно быть: /!@#$^&%*()+=-[\x5B\x5D]\/ndomcasts|:<>?,./im


0

почему вы не делаете что-то вроде:

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

чтобы проверить, содержат ли ваши входные данные какой-либо специальный символ


17
ОП говорит, что он пытается удалить специальные символы, не видя их существования.
Annakata

Это одно из хороших решений, но это позволит использовать только буквы английского алфавита и пробел, но удалит такие символы, как, èéòàùìа в некоторых случаях это не будет решением
mapmalith

0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")Я так и сделал. Но есть некоторые люди, которые сделали это намного проще, какstr.replace(/\W_/g,"");


Большинство вещей в вашем подходе являются избыточными, поскольку \Wсодержат некоторые символы. Но зачем вам отфильтровывать числа? Это не специальные символы.
user4642212
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.