web-dev-qa-db-fra.com

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

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

Comment puis-je faire ceci?

76
Tanu

Cela dépend de ce que vous voulez dire. Si vous voulez juste vous en débarrasser, procédez comme suit:
(Mise à jour: vous souhaitez apparemment conserver les chiffres, utilisez les deuxièmes 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 améliorés de manière significative en précompilant le motif regex et en le stockant dans une constante)

Ou, avec Goyave :

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 les caractères accentués en quelque chose de raisonnable qui soit toujours ascii, regardez ces questions:

166
Sean Patrick Floyd

J'utilise ceci. 

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

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

Ici 

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

\ W: un caractère autre que Word

58
Dhiral Pandya

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

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

Et si vous voulez ne conserver que des caractères alphabétiques, utilisez-le.

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

Ici, tous les caractères spéciaux, à l'exception de l'espace, des virgules et des esperluettes, sont remplacés. Vous pouvez également omettre les espaces, virgules et esperluettes à l'aide de l'expression régulière suivante.

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

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

1
Mike Clark

Suivant l'exemple de la réponse de Andrzej Doyle , je pense que la meilleure solution consiste à 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;
    }
}
1
Marco Sulla

Remplacez les caractères spéciaux par

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

ex: remplacer toute l'occurrence de * par un espace blanc 

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

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

0
krishna murthy

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 pattern et matcher pour rechercher/modifier/supprimer des chaînes définies par l'utilisateur. Ce lien contient des exemples simples et faciles à comprendre pour les expressions régulières: http://www.vogella.de/articles/JavaRegularExpressions/article.html

0
Madhu Nandan

Pour les espaces, utilisez "[^ a-z A-Z 0-9]" ce motif

0
Muhammad Ahsan

Vous pouvez obtenir l’unicode pour ce caractère indésirable à partir de l’outil charactermap dans window pc et ajouter\ug, par exemple.\u00a9 pour le symbole de copyright . Maintenant, vous pouvez utiliser cette chaîne avec ce caractère indésirable particulier, ne supprimez aucun caractère indésirable, mais remplacez-le par le code Unicode approprié.

0
Mundroid