Como remover caracteres especiais de uma string?

92

Quero remover caracteres especiais como:

- + ^ . : ,

de uma String usando Java.

Sameek Mishra
fonte
Aparentemente, você já sabe o que é regex com base em como você marcou sua pergunta. Você tentou ler a documentação da Stringaula? Em particular, procure a palavra 'regex'; existem alguns métodos, e um pouco de reflexão deve dizer a você como proceder ... :)
Karl Knechtel
3
A frase "personagem especial" é tão usada que quase não tem sentido. Se o que você quer dizer é: "Tenho esta lista de caracteres específicos que desejo remover", faça o que Thomas sugere e forme seu padrão com uma classe de caracteres regex e removê- replaceAlllos. Se você tiver requisitos mais esotéricos, edite a pergunta. :)
Ray Toal
1
esses não são caracteres especiais ... são: äâêíìéè, já que eles não são seus tipos de caracteres de 1 byte comuns como - + ^ são ... de qualquer maneira, como Ray afirmou, faça um replaceAllpara eles ou analise a string, adicione os caracteres que não são os caracteres que você deseja tirar para outra string e no final apenas faça um + = para uma String que você retornará.
Gonçalo Vieira
deleteChars.apply( fromString, "-+^.:," );- encontre deleteChars aqui
Kaplan

Respostas:

258

Isso depende do que você define como caracteres especiais, mas tente replaceAll(...):

String result = yourString.replaceAll("[-+.^:,]","");

Observe que o ^ caractere não deve ser o primeiro da lista, já que você teria que escapar dele ou significaria "qualquer um, menos esses caracteres".

Outra observação: o -caractere precisa ser o primeiro ou o último na lista, caso contrário, você teria que escapar ou definiria um intervalo (por exemplo :-,, significaria "todos os caracteres no intervalo :até ,).

Assim, a fim de manter a consistência e não dependem de posicionamento personagem, você pode querer escapar todos aqueles personagens que têm um significado especial em expressões regulares (a lista a seguir não é completa, para estar ciente de outros personagens como (, {, $ etc.) :

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");


Se você quiser se livrar de todos os sinais de pontuação e símbolos, tente este regex: \p{P}\p{S}(lembre-se de que nas strings Java você teria que escapar de barras invertidas:"\\p{P}\\p{S}" .

Uma terceira forma pode ser algo assim, se você puder definir exatamente o que deve ser deixado em sua string:

String  result = yourString.replaceAll("[^\\w\\s]","");

Isso significa: substitua tudo que não seja um caractere de palavra (az em qualquer caso, 0-9 ou _) ou espaço em branco.

Editar: observe que existem alguns outros padrões que podem ser úteis. No entanto, não posso explicar todos eles, então dê uma olhada na seção de referência de regular-expressions.info .

Aqui está uma alternativa menos restritiva para a abordagem "definir caracteres permitidos", conforme sugerido por Ray:

String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");

A regex corresponde a tudo o que não seja uma letra em qualquer idioma e não seja um separador (espaço em branco, quebra de linha etc.). Observe que você não pode usar[\P{L}\P{Z}] (maiúscula P significa não ter essa propriedade), pois isso significaria "tudo que não é uma letra ou não é espaço em branco", o que quase corresponde a tudo, já que as letras não são espaços em branco e vice-versa.

Informações adicionais sobre Unicode

Alguns caracteres Unicode parecem causar problemas devido às diferentes maneiras possíveis de codificá-los (como um único ponto de código ou uma combinação de pontos de código). Consulte regular-expressions.info para obter mais informações.

Thomas
fonte
+1 para a melhor solução de uso geral. Como você está listando algumas variações na ausência de detalhes do OP, pode também mostrar e explicar padrões como[\P{L}]
Ray Toal
Observe também que o -caractere deve ser o primeiro ou o último na lista ou precisa ter escape.
kapex
[^\\p{L}\\p{Z}]parece eliminar tremas alemães (ä, ö, ü) também (pelo menos para mim: /), então "A regex corresponde a tudo o que não é uma letra em qualquer idioma" não parece ser 100% correto
Peter
@Peter não elimina esses caracteres em meus testes. Pode haver outro problema no seu caso, por exemplo, uma codificação diferente do texto. Vou adicionar um link para mais informações.
Thomas
1
@Thomas String result = yourString.replaceAll("[^\w\s]","");comete erroInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth
41

Isso irá substituir todos os caracteres, exceto alfanuméricos

replaceAll("[^A-Za-z0-9]","");
Stephen
fonte
Isso removerá os caracteres árabes também.
S0haib Nasir
1
Esta é a melhor resposta.
Marius Razvan Varvarei
18

Conforme descrito aqui http://developer.android.com/reference/java/util/regex/Pattern.html

Os padrões são expressões regulares compiladas. Em muitos casos, os métodos de conveniência, como String.matches, String.replaceAlle String.splitserá preferível, mas se você precisa fazer um monte de trabalho com a mesma expressão regular, pode ser mais eficiente para compilar uma vez e reutilizá-lo. A classe Pattern e seu companheiro, Matcher, também oferecem mais funcionalidade do que a pequena quantidade exposta por String.

public class RegularExpressionTest {

public static void main(String[] args) {
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));
}

 public static String getOnlyDigits(String s) {
    Pattern pattern = Pattern.compile("[^0-9]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
 public static String getOnlyStrings(String s) {
    Pattern pattern = Pattern.compile("[^a-z A-Z]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
}

Resultado

String is = one
Number is = 9196390097
turbandroid
fonte
Isso removerá os caracteres árabes
S0haib Nasir
15

Experimente o replaceAll()método da Stringclasse.

BTW, aqui está o método, tipo de retorno e parâmetros.

public String replaceAll(String regex,
                         String replacement)

Exemplo:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

Deve remover todos os caracteres {'^', '+', '-'} que você deseja remover!

omt66
fonte
6

Para remover o caractere especial

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

O resultado será: abdd.

Isso funciona perfeitamente.

Akila
fonte
1
obterá um caractere de escape ilegal na string literal
John Joe
Isso também removerá os espaços se você quiser mantê-los, use t2 = t2.replaceAll ("[^ \\ w \\ s]", "");
Isuru Dilshan
2

Use o String.replaceAll()método em Java. replaceAll deve ser bom o suficiente para o seu problema.

MT.
fonte
1

Você pode remover um único caractere da seguinte maneira:

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

RESULTADO:

919595354336
Satya
fonte
0

Se você quiser apenas fazer uma substituição literal em java, use Pattern.quote(string)para escapar qualquer string para um literal.

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
Tezra
fonte