2010-12-07 3 views
155

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

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

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

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

+15

Что-то вроде этого было бы лучше, чем белый список, а не черный список. то вы могли бы просто сделать [a-z] | [0-9] | \ s – 2010-12-07 08:49:25

+0

Любая ошибка скрипта? Вы отлаживали? Или добавьте блок try ... catch в код javascript. – Kangkan 2010-12-07 08:49:31

+0

@ Ape-inago можете ли вы объяснить RegExp немного больше мне, пожалуйста, – 2010-12-07 08:50:29

ответ

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

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

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

1

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

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

1

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

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

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

61

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

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

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

-9

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

3

Первое решение не работает для любого UTF-8 alphaben. (Он вырежет текст, такой как Їжак). Мне удалось создать функцию, которая не использует 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; 
} 
8

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

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

  • Добавить в своем регулярном выражении все специальные символы, которые вы не хотите удалить,
    , например: [^èéòàùì\w\s].
  • Посмотрите на xregexp.com. XRegExp добавляет базовую поддержку для согласования Unicode с помощью синтаксиса \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>

0

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