web-dev-qa-db-fra.com

Comment filtrer une chaîne de caractères indésirables à l'aide de regex?

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. 

26
Stefan Hendriks

Édité en fonction de votre mise à jour:

dirtyString.replaceAll("[^a-zA-Z0-9]","")
47
jzd

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.

12
Cowan

Utilisez replaceAll .

9
Nicolas

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».

6
trojanfoe
String resultString = subjectString.replaceAll("\\P{L}+", "");

remplacera tout caractère non lettre par rien.

5
Tim Pietzcker

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 ... 

0