Удалите все специальные символы с помощью RegExp - PullRequest
202 голосов
/ 07 декабря 2010

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

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

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

Также было бы полезно подробное описание RegExp.

Ответы [ 8 ]

555 голосов
/ 07 декабря 2010
var desired = stringToReplace.replace(/[^\w\s]/gi, '')

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

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

87 голосов
/ 19 июня 2012

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

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

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

18 голосов
/ 27 ноября 2016

Обычное регулярное выражение 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>
7 голосов
/ 21 октября 2014

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

1 голос
/ 23 июня 2017

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

1 голос
/ 07 декабря 2010

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

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

0 голосов
/ 20 апреля 2014

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

0 голосов
/ 07 декабря 2010

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

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

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

...