Folgendes ersetzt ASCII-Steuerzeichen (Abkürzung für [\x00-\x1F\x7F]
):
my_string.replaceAll("\\p{Cntrl}", "?");
Im Folgenden werden alle nicht druckbaren ASCII-Zeichen (Abkürzung für [\p{Graph}\x20]
) ersetzt, einschließlich Zeichen mit Akzent:
my_string.replaceAll("[^\\p{Print}]", "?");
Beides funktioniert jedoch nicht für Unicode-Zeichenfolgen. Hat jemand eine gute Möglichkeit, nicht druckbare Zeichen aus einer Unicode-Zeichenfolge zu entfernen?
Antworten:
Weitere Informationen zu Unicode-Regex .
java.util.regexPattern
IchString.replaceAll
unterstütze sie.quelle
char c = 0xFFFA; String.valueOf(c).replaceAll("\\p{C}", "?");
Auch im Javadoc für Muster-Look im Abschnitt Unicode-Unterstützung heißt es, dass es die Kategorien unterstützts.replaceAll("[\\p{C}\\p{Z}]", "")
den Reiz habenreplaceAll("[^\\u0000-\\uFFFF]", "")
aber keinen Erfolg gehabtOp De Cirkel hat größtenteils recht. Sein Vorschlag wird in den meisten Fällen funktionieren:
Wenn
myString
es sich jedoch um Nicht-BMP-Codepunkte handelt, ist dies komplizierter.\p{C}
enthält die Ersatzcodepunkte von\p{Cs}
. Die oben beschriebene Ersetzungsmethode beschädigt Nicht-BMP-Codepunkte, indem manchmal nur die Hälfte des Ersatzpaars ersetzt wird. Es ist möglich, dass dies eher ein Java-Fehler als ein beabsichtigtes Verhalten ist.Die Verwendung der anderen Kategorien ist eine Option:
Einzelne Ersatzzeichen, die nicht Teil eines Paares sind (jedem Ersatzzeichen ist ein Codepunkt zugewiesen), werden jedoch nicht entfernt. Ein Nicht-Regex-Ansatz ist der einzige Weg, den ich richtig handhaben kann
\p{C}
:quelle
Möglicherweise interessieren Sie sich für die Unicode-Kategorien "Andere, Steuerelemente" und möglicherweise "Andere, Format" (letztere scheinen leider sowohl nicht druckbare als auch druckbare Zeichen zu enthalten).
In Java regulären Ausdrücken können Sie überprüfen , für deren Verwendung
\p{Cc}
und\p{Cf}
sind.quelle
Methoden im Schlag für Ihr Ziel
quelle
Ich habe diese einfache Funktion dafür verwendet:
Hoffe das ist nützlich.
quelle
Basierend auf den Antworten von Op De Cirkel und noackjr mache ich Folgendes für die allgemeine Zeichenfolgenreinigung: 1. Trimmen führender oder nachfolgender Leerzeichen, 2. dos2unix, 3. mac2unix, 4. Entfernen aller "unsichtbaren Unicode-Zeichen" mit Ausnahme von Leerzeichen:
myString.trim.replaceAll("\r\n", "\n").replaceAll("\r", "\n").replaceAll("[\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}&&[^\\s]]", "")
Getestet mit Scala REPL.
quelle
Ich schlage vor, die nicht druckbaren Zeichen wie unten zu entfernen, anstatt sie zu ersetzen
quelle
Ich habe den Code für Telefonnummern +9 (987) 124124 Ziffern aus einer Zeichenfolge in Java extrahiert
quelle