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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

Простое регулярное выражение 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>

Ответ 4

Первое решение не работает для любого алфавита 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).

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

jQuery Form Validator делает его намного проще, добавляя атрибут проверки данных в тегах HTML. Проверьте его сайт.

 

Ответ 9

использовать регулярное выражение ^[^/\\()[email protected]#$%^&*{«»„"""‘’|\n\t….,;`^"<>'}+:?®©]*$