web-dev-qa-db-de.com

Wie kann man mit Regex Zeichenfolgen nach unerwünschten Zeichen filtern?

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. 

26
Stefan Hendriks

Basierend auf Ihrem Update bearbeitet:

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

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.

12
Cowan

Verwenden Sie replaceAll .

9
Nicolas

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.

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

ersetzt alle Zeichen ohne Buchstaben.

5
Tim Pietzcker

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

0