En gros, je me demande s’il existe une classe ou une méthode pratique pour filtrer une chaîne pour les caractères indésirables. Le résultat de la méthode doit être la chaîne "nettoyée". C'est à dire:
String dirtyString = "This contains spaces which are not allowed"
String result = cleaner.getCleanedString(dirtyString);
Le résultat attendu serait:
"Thiscontainsspaceswhicharenotallowed"
Un meilleur exemple:
String reallyDirty = " this*is#a*&very_dirty&String"
String result = cleaner.getCleanedString(dirtyString);
Je m'attends à ce que le résultat soit:
"thisisaverydirtyString"
Parce que, je laisse le nettoyeur savoir que '', '*', '#', '&' et '_' sont des caractères sales. Je peux le résoudre en utilisant un tableau de caractères blanc/noir. Mais je ne veux pas réinventer la roue.
Je me demandais s'il existait déjà une telle chose qui puisse "nettoyer" les chaînes en utilisant une expression régulière. Au lieu d'écrire cela moi-même.
Ajout: Si vous pensez que nettoyer une corde pourrait être fait différemment/mieux, alors je suis tout ouïe aussi bien sûr
Un autre ajout: - Ce n'est pas seulement pour les espaces, mais pour tout type de personnage.
Édité en fonction de votre mise à jour:
dirtyString.replaceAll("[^a-zA-Z0-9]","")
Si vous utilisez guava sur votre projet (et si vous ne l'utilisez pas, je pense que vous devriez en tenir compte), la classe CharMatcher gère cela très bien:
Votre premier exemple pourrait être:
result = CharMatcher.WHITESPACE.removeFrom(dirtyString);
alors que votre seconde pourrait être:
result = CharMatcher.anyOf(" *#&").removeFrom(dirtyString);
// or alternatively
result = CharMatcher.noneOf(" *#&").retainFrom(dirtyString);
ou si vous voulez être plus flexible avec les espaces (onglets, etc.), vous pouvez les combiner plutôt que d'écrire les vôtres:
CharMatcher illegal = CharMatcher.WHITESPACE.or(CharMatcher.anyOf("*#&"));
result = illegal.removeFrom(dirtyString);
ou vous pouvez plutôt spécifier des caractères légaux qui, selon vos besoins, peuvent être:
CharMatcher legal = CharMatcher.Java_LETTER; // based on Unicode char class
CharMatcher legal = CharMatcher.ASCII.and(CharMatcher.Java_LETTER); // only letters which are also ASCII, as your examples
CharMatcher legal = CharMatcher.inRange('a', 'z'); // lowercase only
CharMatcher legal = CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z')); // either case
suivi de retainFrom(dirtyString)
comme ci-dessus.
Très belle API puissante.
Utilisez replaceAll
.
Cela va le faire:
String dirtyString = "This contains spaces which are not allowed";
String result = dirtyString.replaceAll("\\s", "");
et fonctionne en remplaçant tous les espaces par «rien».
String resultString = subjectString.replaceAll("\\P{L}+", "");
remplacera tout caractère non lettre par rien.
Je préfère aussi l'approche de la liste blanche. Vous ne saurez jamais ce qui se passe. Il semble y avoir plus d'encodages que de caractères. De cette façon, vous pouvez tout contrôler:
public String convert(String s) {
s = StringUtils.removePattern(s, "[^A-Za-zäöüÄÖÜß?!$,. 0-9\\-\\+\\*\\?=&%\\$§\"\\!\\^#:;,_²³°\\[\\]\\{\\}<>\\|~]'`'");
return s.trim();
}
Il contient tous les umlauts et les accents français et ... vous voyez, il suffit de regarder votre clavier. Je pense que je les ai tous choisis . N'hésitez pas à omettre les caractères spéciaux comme <> pour empêcher l'injection de code ...