Entfernen von nicht-ASCII-Zeichen, nicht druckbare Zeichen aus einem String
Bekomme ich Benutzereingaben, einschließlich nicht-ASCII-Zeichen und nicht druckbare Zeichen, wie
\xc2d
\xa0
\xe7
\xc3\ufffdd
\xc3\ufffdd
\xc2\xa0
\xc3\xa7
\xa0\xa0
Beispiel:
email : abc@gmail.com\xa0\xa0
street : 123 Main St.\xc2\xa0
gewünschte Ausgabe:
email : abc@gmail.com
street : 123 Main St.
Was ist der beste Weg, um entfernen Sie Sie mit Java?
Ich habe Folgendes versucht, aber scheint nicht zu funktionieren
public static void main(String args[]) throws UnsupportedEncodingException {
String s = "abc@gmail\\xe9.com";
String email = "[email protected]\\xa0\\xa0";
System.out.println(s.replaceAll("\\P{Print}", ""));
System.out.println(email.replaceAll("\\P{Print}", ""));
}
Ausgabe
abc@gmail\xe9.com
abc@gmail.com\xa0\xa0
- warum willst du Sie entfernen?
- Mongo schlägt zu serialisieren diese Werte
- benötigt] \xc2d ist eine gültige Unicode-Zeichen. Wenn MongoDB verwendet UTF-8 ist, sollte in der Lage sein zu serialisieren. Vielleicht haben Sie ein XY-Problem hier? Wie sind Sie mit der Serialisierung Ihren text?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Anforderungen nicht klar sind. Alle Zeichen in einem Java -
String
sind Unicode-Zeichen, also, wenn Sie Sie entfernen, werden Sie Links mit einem leeren string. Ich nehme an was du meinst, ist, dass Sie entfernen möchten alle nicht-ASCII-Zeichen, nicht druckbare Zeichen.Hier
\p{Print}
stellt eine POSIX-Zeichenklasse für druckbare ASCII-Zeichen, während\P{Print}
ist das Komplement der Klasse. Mit diesem Ausdruck werden alle Zeichen, die nicht druckbaren ASCII ersetzt werden, mit der leere string. (Die zusätzlichen umgekehrten Schrägstrich ist da\
startet eine escape-Sequenz, die in string-literalen.)Offenbar alle Zeichen sind eigentlich die ASCII-Zeichen repräsentieren ein printable-Codierung von non-printable "oder" nicht-ASCII-Zeichen. Mongo sollte keine Schwierigkeiten haben, mit diesen Saiten, denn Sie enthalten nur reinen druckbaren ASCII-Zeichen.
Klingt das alles ein wenig fischig zu mir. Was ich glaube, was passiert ist, dass die Daten wirklich enthalten nicht druckbare und nicht-ASCII-Zeichen, und eine andere Komponente (wie ein logging-framework) ist das ersetzen dieser mit einer druckbaren Darstellung. In Ihrer einfachen tests, Sie sind nicht zu übersetzen, die druckbare Darstellung wieder auf die ursprüngliche Zeichenfolge, so dass Sie fälschlicherweise glauben, dass der erste reguläre Ausdruck funktioniert nicht.
Das ist meine Vermutung, aber wenn ich habe die situation falsch eingeschätzt und Sie wirklich brauchen, um Streifen aus wörtlichen
\xHH
entgeht, können Sie es mit dem folgenden regulären Ausdruck.In der API-Dokumentation für die
Pattern
Klasse macht einen guten job mit der Auflistung aller von der syntax unterstützt, die von der Java-regex-Bibliothek. Für die weitere Ausarbeitung auf, was die syntax bedeutet das, dass ich gefunden habe, die Regular-Expressions.info Website sehr hilfreich.String
oderchar
literal ist eine escape-Sequenz ersetzt wird, die mit \. Wenn Sie möchten, eine Unicode-escape verwenden Sie\uXXXX
, wobei XXXX für die Unicode-Punkt, in hexadezimal.String s = "abc@gmail\u00e9.com";
Mit Google Guava's
CharMatcher
, können Sie entfernen Sie alle nicht-druckbare Zeichen und dann behalten alle ASCII-Zeichen (fallen Akzente) so:Nicht sicher, ob das, was Sie wirklich wollen, aber es entfernt alles, was ausgedrückt werden als escape-Sequenzen, die in Ihrer Frage die sample-Daten.
Ich weiß, es ist vielleicht spät, aber für zukünftige Referenz:
Entfernt alle nicht druckbaren Zeichen, aber das gehört
\n
(line feed), die\t
(tab) und\r
(carriage return), und manchmal werden Sie wollen, um diese Zeichen.Für dieses problem verwenden invertierte Logik:
Können Sie versuchen, diesen code:
Es funktioniert für mich, entfernen Sie ungültige Zeichen aus
String
.Können Sie java.text.normalizer
Input => "Diese \u7279text \u7279ist, was ich brauche"
Ausgabe => "Dieser text ist, was ich brauche"
Wenn Sie versuchen, Sie zu entfernen, Unicode-Zeichen aus einem string wie oben angegeben, dieser code funktioniert