Remova todos os caracteres especiais, exceto o espaço, de uma sequência usando JavaScript

157

Desejo remover todos os caracteres especiais, exceto o espaço, de uma string usando JavaScript.

Por exemplo, abc's test#s deve gerar como abcs tests.

nithi
fonte
3
Como você define caracteres especiais?
Keith Irwin

Respostas:

349

Você deve usar a função de substituição de cadeia, com um único regex. Assumindo caracteres especiais, você quer dizer qualquer coisa que não seja letra, eis uma solução:

const str = "abc's test#s";
console.log(str.replace(/[^a-zA-Z ]/g, ""));

Petar Ivanov
fonte
5
Para utilizar esta solução em alfabeto não-latino verifique esta resposta para fora
efkan
Isso também removerá caracteres numéricos!
tech_geek
15
@tech_geek você pode fazerstr.replace(/[^a-zA-Z0-9]/g, "")
Chidi Williams
2
Na verdade, você precisa deste str.replace(/[^a-zA-Z0-9 ]/g, "");aviso há um espaço entre 0-9 e]
Ammar Shah
Ele precisa de alguns ajustes, não removeu / ou - caracteres e o primeiro caractere de camelCase deveria estar em letras minúsculas, mas este em maiúsculas.
Sansun 6/03
133

Você pode especificar os caracteres que deseja remover:

string = string.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '');

Como alternativa, para alterar todos os caracteres, exceto números e letras, tente:

string = string.replace(/[^a-zA-Z0-9]/g, '');
Lakshmana Kumar D
fonte
4
e se eu não quiser remover espaço usando isso? /[^a-zA-Z0-9]/g
aadi1295
8
@ArbazAbid para manter o espaço, adicione-o aos caracteres listados em branco. seu regex seria "/ [^ a-zA-Z0-9] / g" (aviso de espaço em branco após 9)
Crhistian Ramirez
1
Essa foi a resposta que funcionou, se for necessário um espaço.
29419 Nathan
isso substitui ()e whitespacesna string.text().replace(/[ ()]/g, '')
C Alonso C Ortega
30

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 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<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 também funcionará para os chineses e você também receberá benefícios colaterais ao fazer Tromsø== Tromso).

Gaivota
fonte
Obrigado por esta solução bastante criativa. Está muito mais alinhado com o modo como os idiomas realmente funcionam, pois muitos de nós não consideram caracteres especiais "Привіт" ou "æøå". A maioria das soluções existentes recorta qualquer caractere que não faça parte do alfabeto inglês.
Alex Langberg 17/05
1
Quase a resposta perfeita para mim, mas infelizmente considera os caracteres chineses caracteres especiais.
precisa
@EricMajerus e hindi too
programador
Cuidado, isso também considera números como caracteres especiais.
23418 just -user
11

Não sei JavaScript, mas não é possível usar regex?

Algo como [^\w\d\s]irá corresponder a qualquer coisa, exceto dígitos, caracteres e espaços em branco. Seria apenas uma pergunta para encontrar a sintaxe no JavaScript.

Thiago Moraes
fonte
1
stackoverflow.com/a/4374890/2384606 Esta é a resposta à sua pergunta :)
Carmela
8

Tentei a solução muito criativa da Seagul, mas achei que os números também eram tratados como caracteres especiais, que não atendiam às minhas necessidades. Então, aqui está o meu (à prova de falhas) da solução da Seagul ...

//return true if char is a number
function isNumber (text) {
  if(text) {
    var reg = new RegExp('[0-9]+$');
    return reg.test(text);
  }
  return false;
}

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}
Mozfet
fonte
Você esqueceu de declarar regem sua primeira função.
Noman Ali
6

pesquisar tudo não (caracteres de palavra || espaço):

str.replace(/[^\w ]/, '')
dovid
fonte
1

Tente usar este

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

aqui ^ carat é para negação \ w para [a-zA-Z0-9_] caracteres de palavra e \ s para espaço / [] / gi para global

Shrinivasan
fonte
0

ponto (.) pode não ser considerado especial. Adicionei uma condição OR à resposta da Mozfet & Seagull:

function isNumber (text) {
      reg = new RegExp('[0-9]+$');
      if(text) {
        return reg.test(text);
      }
      return false;
    }

function removeSpecial (text) {
  if(text) {
    var lower = text.toLowerCase();
    var upper = text.toUpperCase();
    var result = "";
    for(var i=0; i<lower.length; ++i) {
      if(isNumber(text[i]) || (lower[i] != upper[i]) || (lower[i].trim() === '') || (lower[i].trim() === '.')) {
        result += text[i];
      }
    }
    return result;
  }
  return '';
}
hassanf1
fonte
0

const input = `#if_1 $(PR_CONTRACT_END_DATE) == '23-09-2019' # 
Test27919<alerts@imimobile.com> #elseif_1 $(PR_CONTRACT_START_DATE) ==  '20-09-2019' #
Sender539<rama.sns@gmail.com> #elseif_1 $(PR_ACCOUNT_ID) == '1234' #
AdestraSID<hello@imimobile.co> #else_1#Test27919<alerts@imimobile.com>#endif_1#`;
const replaceString = input.split('$(').join('->').split(')').join('<-');


console.log(replaceString.match(/(?<=->).*?(?=<-)/g));

sudheer nunna
fonte
-11

Quais caracteres especiais você deseja remover de uma sequência, prepare uma lista deles e, em seguida, a função de substituição do javascript do usuário para remover todos os caracteres especiais.

var str = 'abc'de#;:sfjkewr47239847duifyh';
alert(str.replace("'","").replace("#","").replace(";","").replace(":",""));

ou você pode executar um loop para uma sequência inteira e comparar um único caractere com o código ASCII e gerar novamente uma nova sequência.

Gaurav Agrawal
fonte
9
Não, por favor não faça isso. É realmente muito lento. É muito, muito melhor usar uma expressão regular.
Keith Irwin
Esta solução é muito boa para substituir apenas um caractere. No meu caso, foi útil, obrigado.
Vahid Najafi 28/03
Em vez de usar o método de substituição várias vezes, use-o apenas uma vez usando expressões regulares.
FAISAL