Como substituir caracteres especiais em uma string?

90

Eu tenho uma string com muitos caracteres especiais. Quero remover tudo isso, mas manter os caracteres alfabéticos.

Como posso fazer isso?

Tanu
fonte
Olhe este tópico: stackoverflow.com/questions/3438854/…
Cyril Gandon

Respostas:

186

Isso depende do que você quer dizer. Se você apenas deseja se livrar deles, faça o seguinte:
(Atualização: aparentemente, você também deseja manter os dígitos, use as segundas linhas nesse caso)

String alphaOnly = input.replaceAll("[^a-zA-Z]+","");
String alphaAndDigits = input.replaceAll("[^a-zA-Z0-9]+","");

ou o equivalente:

String alphaOnly = input.replaceAll("[^\\p{Alpha}]+","");
String alphaAndDigits = input.replaceAll("[^\\p{Alpha}\\p{Digit}]+","");

(Tudo isso pode ser significativamente melhorado ao pré-compilar o padrão regex e armazená-lo em uma constante)

Ou, com Goiaba :

private static final CharMatcher ALNUM =
  CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z'))
  .or(CharMatcher.inRange('0', '9')).precomputed();
// ...
String alphaAndDigits = ALNUM.retainFrom(input);

Mas se você quiser transformar caracteres acentuados em algo sensível que ainda é ascii, olhe para estas questões:

Sean Patrick Floyd
fonte
quando estou usando esta função, ela está removendo todos os números também. mas eu não quero que os números sejam removidos. apenas quero remover caracteres especiais. Sugira algo ...
Tanu
bem, você disse que só queria o alfabeto. Mas atualizarei minha resposta em um minuto
Sean Patrick Floyd
Eu quero concat string, mas com alguma condição como 1.Se houver apenas um resultado, nenhuma concat é necessária 2.Se o resultado for mais do que 1 do que concat string no seguinte exemplo de formato: pilha + sobre + fluxo
Tanu
2
@Tanu, essa é uma questão diferente. Faça um novo
Pekka
E se eu não quiser que os espaços sejam removidos? ou digamos que todos os espaços são tabulações, novas linhas recolhidas como apenas um espaço?
maldito
74

Eu estou usando isso

s = s.replaceAll("\\W", ""); 

Ele substitui todos os caracteres especiais da string.

Aqui

\ w: um caractere de palavra, abreviação de [a-zA-Z_0-9]

\ W: um caractere não verbal

Dhiral Pandya
fonte
Não funciona para <script> alert ('XSS Attack') </script>. Como remover '<', '>', '\' caracteres?
Manoj
11

Você pode usar o método a seguir para manter os caracteres alfanuméricos.

replaceAll("[^a-zA-Z0-9]", "");

E se você quiser manter apenas caracteres alfabéticos, use este

replaceAll("[^a-zA-Z]", "");
dhuma1981
fonte
5
Para uso do espaçoreplaceAll("[^a-zA-Z0-9 ]", "");
Qamar
5

Substitua quaisquer caracteres especiais por

replaceAll("\\your special character","new character");

ex: substituir todas as ocorrências de * por espaço em branco

replaceAll("\\*","");

* esta declaração só pode substituir um tipo de caractere especial por vez

Krishnamurthy
fonte
Definitivamente, o que eu estava procurando quando vi o título da pergunta "Como substituir caracteres especiais em uma string?" obrigado!
Mr.Drew
2
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9&, _]|^\s)", "");

Aqui, todos os caracteres especiais, exceto espaço, vírgula e E comercial, são substituídos. Você também pode omitir espaço, vírgula e "e" comercial pela seguinte expressão regular.

string Output = Regex.Replace(Input, @"([ a-zA-Z0-9_]|^\s)", "");

Onde Input é a string que precisamos para substituir os caracteres.

Mike Clark
fonte
2

Seguindo o exemplo da resposta de Andrzej Doyle , acho que a melhor solução é usar org.apache.commons.lang3.StringUtils.stripAccents():

package bla.bla.utility;

import org.apache.commons.lang3.StringUtils;

public class UriUtility {
    public static String normalizeUri(String s) {
        String r = StringUtils.stripAccents(s);
        r = r.replace(" ", "_");
        r = r.replaceAll("[^\\.A-Za-z0-9_]", "");
        return r;
    }
}
Marco Sulla
fonte
0

Você pode usar expressões regulares básicas em strings para localizar todos os caracteres especiais ou usar classes padrão e correspondentes para pesquisar / modificar / excluir strings definidas pelo usuário. Este link contém alguns exemplos simples e fáceis de entender para expressões regulares: http://www.vogella.de/articles/JavaRegularExpressions/article.html

Madhu Nandan
fonte
0

Você pode obter o Unicode para esse caractere lixo na ferramenta de mapa de caracteres no pc da janela e adicionar \ u eg \ u00a9 para o símbolo de copyright. Agora você pode usar essa string com aquele caractere de lixo em particular, não remova nenhum caractere de lixo, mas substitua pelo Unicode adequado.

Mundroid
fonte
0

Para espaços, use "[^ az AZ 0-9]" este padrão

Muhammad Ahsan
fonte