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?
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:
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
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]", "");
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.
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;
}
}
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
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
Pour les espaces, utilisez "[^ a-z A-Z 0-9]" ce motif
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é.