Удалить все специальные символы регулярных выражений


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

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

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

подробное описание регулярного выражения также было бы полезно.

8 174

8 ответов:

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

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

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

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

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

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

обычный JavaScript регулярное выражение не обрабатывает письма в Юникоде.

не используйте [^\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>

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

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

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

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

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

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

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

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

использовать regex ^[^/\()~!@#$%^&*{«»„““”‘’|\n\t….,;`^"<>'}+:?®©]*$