2016-03-16 8 views
6

Lassen Sie uns sagen, dass ich den folgenden Code haben:Java entfernen nicht Latein-Grund Zeichen aus string

String description = "★★★★★ ♫ ♬ This description ✔✔ ▬ █ ✖ is a mess. ♫ ♬ ★★★★★"; 

Ich möchte die nicht-lateinischen Zeichen entfernen: , , , , , und .

Und es haben sich dies: This description is a mess.

Ich weiß, es ist wahrscheinlich Tonnen dieser wingdings ähnlichen Zeichen, also statt, was zu spezifizieren würde ich entfernen möchte, ich denke, es ist besser, Liste, was ich behalten wollen : Basic Latin und Latin-1 supplements Zeichen.

fand ich, dass ich den folgenden Code verwenden kann alles, aber die grundlegenden lateinischen Schriftzeichen

String clean_description = description.replaceAll("[^\\x00-\\x7F]", "").trim();

zu entfernen Aber gibt es eine Möglichkeit, die Latin-1 Supplement Zeichen auch zu erhalten?

+3

Da es wie dieser Bereich sieht kommt direkt nach dem Grunde Lateinisch, könntest du nicht einfach die Regex ändern: '" [^ \\ x00 - \\ xFF] "'? – resueman

+0

@resueman das klingt wie eine Antwort ... –

+0

Versuchen '\ p {S}' regex, meinen Beitrag unten – Saleem

Antwort

6

Aus im Zeichen der Suche reichen Sie zur Verfügung gestellten, scheint es, dass "Basic Latin" und "Latin-1 Supplement" benachbart ist (0x00-0x7F und 0x80 - 0xFF).

So können Sie die gleiche Regex verwenden Sie zur Verfügung gestellt, sondern nur die „Latin-1 Supplement“ Zeichen erweitert, um zu umfassen. Das würde wie folgt aussehen:

String clean_description = description.replaceAll("[^\\x00-\\xFF]", "").trim(); 

Wie wies darauf hin, in den Kommentaren von Quinn, bedeutet dies nicht die Räume zwischen den entfernten Abschnitten loszuwerden, so das Ergebnis hat überschüssige Räume (was sein kann oder auch nicht, was Sie wollen). Wenn Sie diese Leerzeichen entfernt, Quinns regex ([^(\\x00-\\xFF)]+(?:$|\\s*), falls der Kommentar gelöscht) möchten für Sie arbeiten.

+1

Die Ergebniszeichenfolge enthält mehr Leerzeichen zwischen Wörtern. Ist das OP-Format gewünscht? Schlagen Sie mit '[^ (\\ x00 - \\ xFF)] + (: $ | \\ s *)', und das Loswerden von 'trim()'. – Quinn

3

Wenn Sie einen beschreibenden Ausdruck verwenden wollen diesen:

description.replaceAll("[^\\p{InBasic_Latin}\\p{InLatin-1Supplement}]", ""); 

oder den Schnittpunkt der Negationen [\P{InBasic_Latin}&&\P{InLatin-1Supplement}] (nicht, dass es besser lesbar;))

+0

habe ich alle Antworten getestet und es scheint, als ob dies die einzige ist, die tatsächlich die '$' Charakter bewahrt (die einen Teil der Latin-1 Supplement Zeichen ist). – RoboticR

+0

@RoboticR mit '[^ \ x00- \ xFF]' würde das gleiche tun. – Thomas

+0

Sie haben Recht. Ich habe das nicht gesehen. – RoboticR