Comment remplacer des caractères spéciaux dans une chaîne?

90

J'ai une chaîne avec beaucoup de caractères spéciaux. Je veux supprimer tous ceux-ci, mais conserver les caractères alphabétiques.

Comment puis-je faire ceci?

Tanu
la source
Regardez ce fil: stackoverflow.com/questions/3438854/…
Cyril Gandon

Réponses:

186

Cela dépend de ce que vous voulez dire. Si vous voulez juste vous en débarrasser, faites ceci:
(Mise à jour: Apparemment, vous voulez aussi garder les chiffres, utilisez les secondes lignes dans ce cas)

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

ou l'équivalent:

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

(Tous ces éléments peuvent être considérablement améliorés en précompilant le modèle de regex et en le stockant dans une constante)

Ou, avec Guava :

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);

Mais si vous voulez transformer des caractères accentués en quelque chose de sensé qui reste ascii, regardez ces questions:

Sean Patrick Floyd
la source
lorsque j'utilise cette fonction, il supprime également tous les numéros.Mais je ne veux pas que les numéros soient supprimés.Je veux simplement supprimer les caractères spéciaux.Veuillez suggérer quelque chose ..
Tanu
eh bien tu as dit que tu voulais seulement l'alphabet. Mais je vais mettre à jour ma réponse dans une minute
Sean Patrick Floyd
Je veux concaténer une chaîne mais avec une condition comme 1.S'il n'y a qu'un seul résultat, aucune concaténation requise 2.Si le résultat est supérieur à 1, la chaîne concatée dans l'exemple de forme suivant: stack + over + flow
Tanu
2
@Tanu, c'est une question différente. Faites-en un nouveau
Pekka
Que faire si je ne veux pas que les espaces soient supprimés? ou dire tous les espaces comme les tabulations, les retours à la ligne réduits comme un seul espace?
damné
74

J'utilise ceci.

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

Il remplace tous les caractères spéciaux de la chaîne.

Ici

\ w: un caractère de mot, abréviation de [a-zA-Z_0-9]

\ W: un caractère autre qu'un mot

Dhiral Pandya
la source
Ne fonctionne pas pour <script> alert ('XSS Attack') </script>. Comment supprimer les caractères '<', '>', '\'?
Manoj
11

Vous pouvez utiliser la méthode suivante pour conserver les caractères alphanumériques.

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

Et si vous souhaitez ne conserver que les caractères alphabétiques, utilisez ceci

replaceAll("[^a-zA-Z]", "");
dhuma1981
la source
5
Pour l'utilisation de l'espacereplaceAll("[^a-zA-Z0-9 ]", "");
Qamar
5

Remplacez tous les caractères spéciaux par

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

ex: pour remplacer toutes les occurrences de * par un espace blanc

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

* cette instruction ne peut remplacer qu'un seul type de caractère spécial à la fois

Krishnamurthy
la source
Certainement ce que je cherchais quand j'ai vu le titre de la question "Comment remplacer des caractères spéciaux dans une chaîne?" Merci!
Mr.Drew
2
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9&, _]|^\s)", "");

Ici, tous les caractères spéciaux sauf l'espace, la virgule et l'esperluette sont remplacés. Vous pouvez également omettre l'espace, la virgule et l'esperluette à l'aide de l'expression régulière suivante.

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

Où Input est la chaîne dont nous avons besoin pour remplacer les caractères.

Mike Clark
la source
2

En suivant l'exemple de la réponse d'Andrzej Doyle , je pense que la meilleure solution est d'utiliser 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
la source
0

Vous pouvez utiliser des expressions régulières de base sur des chaînes pour rechercher tous les caractères spéciaux ou utiliser des classes de modèle et de correspondance pour rechercher / modifier / supprimer des chaînes définies par l'utilisateur. Ce lien contient quelques exemples simples et faciles à comprendre d'expressions régulières: http://www.vogella.de/articles/JavaRegularExpressions/article.html

Madhu Nandan
la source
0

Vous pouvez obtenir unicode pour ce caractère indésirable à partir de l'outil de mappage de caractères dans Windows PC et ajouter \ u par exemple \ u00a9 pour le symbole de copyright. Vous pouvez maintenant utiliser cette chaîne avec ce caractère indésirable particulier, ne supprimez aucun caractère indésirable, mais remplacez-le par le bon Unicode.

Mundroid
la source
0

Pour les espaces, utilisez "[^ az AZ 0-9]" ce modèle

Muhammad Ahsan
la source