Удалить все специальные символы регулярных выражений
Я хотел бы регулярное выражение, которое удалит все специальные символы из строки. Я пытаюсь что-то вроде этого, но он не работает в IE7, хотя он работает в Firefox.
var specialChars = "!@#$^&%*()+=-[]/{}|:<>?,.";
for (var i = 0; i < specialChars.length; i++) {
stringToReplace = stringToReplace.replace(new RegExp("" + specialChars[i], "gi"), "");
}
подробное описание регулярного выражения также было бы полезно.
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);
чтобы проверить, если ваш вход содержит какой-либо специальный символ