Remova todos os caracteres especiais com RegExp

234

Gostaria de um RegExp que remova todos os caracteres especiais de uma string. 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.

Timothy Ruhle
fonte
18
Algo assim seria melhor como uma lista branca, não uma lista negra. então você poderia simplesmente fazer [az] | [0-9] | \ s
Ape-inago
Algum erro de script? Você depurou? Ou então tente um bloco catch no código javascript.
Kangkan
@ Ape-inago, você pode me explicar um pouco mais o RegExp, por favor
Timothy Ruhle
3
Por favor, defina "caractere especial"! "風" é especial para você? (Pensando sobre isso, você vai ver @ ponto de APE-iango.)
deceze
7
Eu não acho que alguém aqui significou alguma ofensa. Eu já me queimei antes fazendo isso como uma lista negra, pois sempre existem aquelas pequenas "pegadinhas" que acabam passando (como os exemplos de deceze). Por fim, a abordagem correta é mais sobre o motivo pelo qual você está tentando fazer isso.
Ape-inago

Respostas:

613
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 na sua lista segura.

O ^caractere de sinal de intercalação ( ) é a negação do conjunto [...], gidigamos , global e sem distinção entre maiúsculas e minúsculas (o último é um pouco redundante, mas eu queria mencionar) e a lista de segurança neste exemplo é dígitos, caracteres de palavra, sublinhados ( \w) e espaço em branco ( \s)

annakata
fonte
50
Esta solução não funciona para símbolos que não são do inglês. ""Жак" por exemplo.
Gaivota
4
Você também pode usar \ W maiúsculo em vez de ^ \ w. \ W: Corresponde a qualquer caractere que não seja da palavra. Equivalente a [^ A-Za-z0-9_]. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/…
delkant
@ Seagull Adicionei uma resposta que lida com Unicodes.
freedev
1
para aceitar acentos palavras, como no idioma português, faça o seguinte: stringToReplace.replace (/ [^ A-Za-ú \ s] / gi, '')
alansiqueira27
1
Para adicionar a maioria dos idiomas europeus (norueguês, sueco, alemão, portoguise, espanhol) stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). Para incluir outros idiomas, é possível usar intervalos unicode. Veja: stackoverflow.com/questions/150033/…
Eskil Mjelva Saatvedt 12/04/19
105

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

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

tome nota de que, para incluir também o caractere "menos", é necessário escapar dele com uma barra invertida como o último grupo. caso contrário, também selecionará 0-9, o que provavelmente é indesejável.

sem entrada
fonte
10
excelente solução! a resposta aceita funciona apenas em inglês, funciona em qualquer idioma (tanto quanto eu verifiquei). obrigado :)
Ronen Ness
1
@knutole remova a ?parte do conjunto de caracteres para a frente. isso lista os caracteres que você deseja remover, portanto, excluí-lo da remoção será inerentemente incluído no resultado final.
noinput
Isso funciona muito bem, se encaixa perfeitamente em qualquer idioma, basta adicionar o caractere que você deseja substituir e é tudo. Obrigado.
Elros Romeo
21

O regex Javascript simples não manipula letras Unicode .

Não use [^\w\s], isso removerá letras com sotaques (como àèéìòù), sem mencionar em cirílico ou chinês, as letras provenientes desses idiomas serão removidas.

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

  • Adicione no seu regex todos os caracteres especiais que você não deseja remover,
    por exemplo: [^èéòàùì\w\s].
  • Dê uma olhada no xregexp.com . O XRegExp adiciona suporte básico à correspondência Unicode por meio da \p{...}sintaxe.

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>

freedev
fonte
3
É bom saber sobre internacionalização. Eu não fazia ideia de que o JS regex não era da UTF-8.
precisa saber é o seguinte
Você não pode colocar todos os UTF-8 cartas válidas para var str
Seagull
@ Seagull sim, mas no caso de você não escrever um aplicativo compatível em todo o mundo, você pode colocar pragmaticamente apenas a lista de letras UTF-8 válidas para suas localizações atuais. No meu caso, para o idioma italiano, existem poucas letras.
freedev
7

A primeira solução não funciona para nenhum alfabeto UTF-8. (Ele cortará texto como Їжак). Eu consegui criar uma função que não usa RegExp e usa bom suporte a UTF-8 no mecanismo JavaScript. A ideia é 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<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

Atualização: observe que esta solução funciona apenas para idiomas em que há letras maiúsculas e minúsculas. Em idiomas como o chinês, isso não vai funcionar.

Atualização 2: cheguei à solução original quando estava trabalhando em uma pesquisa difusa. Se você também estiver tentando remover caracteres especiais para implementar a funcionalidade de pesquisa, existe uma abordagem melhor. Use qualquer biblioteca de transliteração que produza uma sequência apenas de caracteres latinos e, em seguida, o Regexp simples fará toda a mágica de remover caracteres especiais. (Isso funcionará também para os chineses e você também receberá benefícios colaterais ao fazer Tromsø== Tromso).

Gaivota
fonte
Excelente, como esta resposta! Eu o uso para criar um nome de arquivo válido e estendeu sua solução para remover espaços (compatíveis com Linux / Unix) e permitir números também. Então, estendi a instrução if (jQuery envolvido): if (str [i]! == '' && (lower [i]! = Upper [i] || lower [i] .trim () === '' | | $ .isNumeric (str [i])))
Jonny
em muitas línguas não existem letras maiúsculas ... portanto, a função irá considerar a entrada válida como caracteres especiais
Yair Levy
Os caracteres chineses são um exemplo que é eliminado por isso
lethek
Quando criei esta solução, infelizmente, não estava pensando em idiomas como o chinês. A solução deve ser proposta, pois as respostas anteriores também não funcionarão.
Gaivota
1

Eu uso o RegexBuddy para depurar meus regexes, pois tem quase todos os idiomas muito úteis. Em seguida, copie / cole para o idioma de destino. Ferramenta fantástica e não muito cara.

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

millebii
fonte
0

por que você não faz algo como:

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

para verificar se sua entrada contém algum caractere especial

E
fonte
17
O OP diz que está tentando remover caracteres especiais para não ver se eles existem.
Annakata
Esta é uma das boa solução, mas isso só permitirá Inglês números da letra do alfabeto e do espaço, mas ele irá remover caracteres como èéòàùìe alguns casos isso não será a solução
mapmalith
0

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

Eldar Mammadov
fonte
A maioria das coisas na sua abordagem é redundante, pois \Wcontém alguns dos personagens. Mas por que você filtraria os números? Esses não são caracteres especiais.
user4642212