Grundsätzlich frage ich mich, ob es eine praktische Klasse oder Methode gibt, um einen String nach unerwünschten Zeichen zu filtern. Die Ausgabe der Methode sollte der 'gereinigte' String sein. Dh:
String dirtyString = "This contains spaces which are not allowed"
String result = cleaner.getCleanedString(dirtyString);
Das erwartete Ergebnis wäre:
"Thiscontainsspaceswhicharenotallowed"
Ein besseres Beispiel:
String reallyDirty = " this*is#a*&very_dirty&String"
String result = cleaner.getCleanedString(dirtyString);
Ich erwarte das Ergebnis:
"thisisaverydirtyString"
Ich lasse den Reiniger wissen, dass '', '*', '#', '&' und '_' schmutzige Zeichen sind. Ich kann es lösen, indem ich ein weißes/schwarzes Listenfeld von Zeichen verwendet. Aber ich möchte das Rad nicht neu erfinden.
Ich habe mich gefragt, ob es so etwas schon gibt, das Strings mit einem Regex "reinigen" kann. Anstatt dies selbst zu schreiben.
Zusatz: Wenn Sie der Meinung sind, dass das Reinigen eines Strings anders oder besser ist, dann bin ich natürlich auch ganz Ohr
Ein weiterer Zusatz: - Es ist nicht nur für Leerzeichen, sondern für jede Art von Zeichen.
Basierend auf Ihrem Update bearbeitet:
dirtyString.replaceAll("[^a-zA-Z0-9]","")
Wenn Sie guava in Ihrem Projekt verwenden (und wenn nicht, denke ich, sollten Sie es in Betracht ziehen), wird die Klasse CharMatcher sehr gut damit umgehen:
Ihr erstes Beispiel könnte sein:
result = CharMatcher.WHITESPACE.removeFrom(dirtyString);
während Ihre Sekunde könnte sein:
result = CharMatcher.anyOf(" *#&").removeFrom(dirtyString);
// or alternatively
result = CharMatcher.noneOf(" *#&").retainFrom(dirtyString);
oder wenn Sie mit Whitespace (Tabs usw.) flexibler sein möchten, können Sie sie kombinieren, anstatt eigene zu schreiben:
CharMatcher illegal = CharMatcher.WHITESPACE.or(CharMatcher.anyOf("*#&"));
result = illegal.removeFrom(dirtyString);
oder Sie geben stattdessen legale Zeichen an, die je nach Ihren Anforderungen lauten:
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
gefolgt von retainFrom(dirtyString)
wie oben.
Sehr schöne, leistungsfähige API.
Verwenden Sie replaceAll
.
Das wird es tun:
String dirtyString = "This contains spaces which are not allowed";
String result = dirtyString.replaceAll("\\s", "");
und funktioniert, indem alle Leerzeichen durch 'nichts' ersetzt werden.
String resultString = subjectString.replaceAll("\\P{L}+", "");
ersetzt alle Zeichen ohne Buchstaben.
Ich bevorzuge auch den Whitelisting-Ansatz. Sie werden nie wissen, was kommt. Es scheint mehr Kodierungen als Zeichen zu geben. Auf diese Weise können Sie alles steuern:
public String convert(String s) {
s = StringUtils.removePattern(s, "[^A-Za-zäöüÄÖÜß?!$,. 0-9\\-\\+\\*\\?=&%\\$§\"\\!\\^#:;,_²³°\\[\\]\\{\\}<>\\|~]'`'");
return s.trim();
}
Dieses enthält alle deutschen Umlaute und französischen Akzente und ... wissen Sie - schauen Sie einfach auf Ihre Tastatur. Ich denke, ich habe sie alle ausgesucht .. Sie können Sonderzeichen wie <> weglassen, um Code-Injektion zu verhindern ...