Remova todos os caracteres especiais com RegExp

Eu gostaria de um RegExp que irá remover todos os caracteres especiais de uma string. Eu estou tentando algo assim, mas não funciona no IE7, embora funcione no Firefox.

var specialChars = "!@#$^&%*()+=-[]\/{}|:?,."; for (var i = 0; i < specialChars.length; i++) { stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), ""); } 

Uma descrição detalhada do RegExp também seria útil.

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

Como foi mencionado nos comentários, é mais fácil fazer isso como uma lista branca – substitua os caracteres que não estão em sua lista segura.

O caractere circunflexo ( ^ ) é a negação do conjunto, [...] gi dizer global e insensível a maiúsculas e minúsculas (o último é um pouco redundante, mas eu queria mencioná-lo) e a lista segura neste exemplo é dígitos, caracteres de palavra , sublinhados ( \w ) e espaços em branco ( \s ).

Observe que, se você ainda quiser excluir um conjunto, incluindo itens como barras e caracteres especiais, poderá fazer o seguinte:

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

Tome especial nota que, a fim de include também o caractere “menos”, você precisa escaping com uma barra invertida como o último grupo. se você não fizer isso, também selecionará 0-9, o que provavelmente é indesejado.

JavaScript regex simples não manipula letras Unicode .

Não use [^\w\s] , isso irá remover letras com acentos (como àèììòù), para não mencionar para cirílico ou chinês, as letras provenientes de tais idiomas serão removidas.

Você realmente não quer remover essas letras junto com todos os caracteres especiais. Você tem duas chances:

  • Adicione na sua regex todos os caracteres especiais que você não deseja remover,
    por exemplo: [^èéòàùì\w\s] .
  • Dê uma olhada no xregexp.com . XRegExp adiciona suporte base para correspondência Unicode através da syntax \p{...} .
 var str = "Їжак::: résd,$%& adùf" var search = XRegExp('([^?\\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" 
  

A primeira solução não funciona para nenhum alfabeto UTF-8. (Vai cortar o texto como Їжак). Eu consegui criar uma function que não usa RegExp e use bom suporte a UTF-8 no mecanismo de JavaScript. A idéia é simples, se um símbolo é igual em maiúsculas e minúsculas, é um caractere especial. A única exceção é feita para espaços em branco.

 function removeSpecials(str) { var lower = str.toLowerCase(); var upper = str.toUpperCase(); var res = ""; for(var i=0; i 

Atualização: Por favor, note que esta solução funciona apenas para idiomas onde existem letras pequenas e maiúsculas. Em idiomas como o chinês, isso não funcionará.

Eu uso RegexBuddy para debbuging meu regexes tem quase todas as linguagens muito úteis. Do que copiar / colar para o idioma de destino. Ótima ferramenta e não muito cara.

Então eu copio / colei seu regex e seu problema é que [,] são caracteres especiais em regex, então você precisa escaping deles. Portanto, o regex deve ser: /!@#$^&%*()+=-[\x5B\x5D]\/{}|:<>?,./im

por que você não faz algo como:

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

para verificar se a sua input contém algum caracter especial

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "") Eu fiz sth assim. Mas há algumas pessoas que fizeram isso muito mais facilmente, como str.replace(/\W_/g,"");

use regex ^[^/\\()~!@#$%^&*{«»„““”''|\n\t….,;`^"<>'}+:?®©]*$