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?
Réponses:
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:
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
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]", "");
replaceAll("[^a-zA-Z0-9 ]", "");
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
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.
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;
}
}
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
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.
Pour les espaces, utilisez "[^ az AZ 0-9]" ce modèle