2016-03-16 14 views
6

Powiedzmy mam następujący kod:Java usunąć non Łacińskiej podstawowe znaki z łańcucha

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

chciałbym, aby usunąć znaki spoza alfabetu łacińskiego: , , , , , i .

i go stać to: This description is a mess.

Wiem, że pewnie ton tych WingDings-podobnej postaci, więc zamiast określania co chciałabym usunąć, myślę, że lepiej wymienić co chcę zachować : Basic Latin i Latin-1 supplements znaków.

odkryłem, że mogę użyć następującego kodu, aby usunąć wszystko, ale podstawowych znaków łacińskich

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

Ale czy jest jakiś sposób aby zachować również znaków Latin-1 suplementów?

+3

Ponieważ wygląda na to, że zakres przychodzi tuż po podstawowe łaciński, czy nie mógłbyś po prostu zmienić wyrażenia regularnego na to: '" [^ \\ x00 - \\ xFF] "'? – resueman

+0

@resueman to brzmi jak odpowiedź ... –

+0

Spróbuj '\ p {S}' regex, zobacz mój wpis poniżej – Saleem

Odpowiedz

6

Od patrząc na charakter waha podałeś, wydaje się, że "Podstawowy łaciński" i "Latin-1 Supplements" sąsiadują (0x00 - 0x7F i 0x80 - 0xFF).

Można więc użyć tego samego wyrażenia regularnego, które zostało podane, po prostu rozszerzonego o znaki "Latin-1 Supplement". Że będzie wyglądać następująco:

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

Jak zauważył w komentarzach przez Quinn, nie pozbyć się przestrzeni między usuniętymi sekcjach, więc wynik ma nadmiar spacji (który może lub nie może być to, czego chcieć). Jeśli chcesz usunąć te spacje, wyrażeń regularnych Quinn ([^(\\x00-\\xFF)]+(?:$|\\s*), na wypadek, gdyby komentarz został usunięty) może zadziałać.

+1

Łańcuch wynikowy zawiera więcej spacji pomiędzy słowami. Czy jest to pożądany format OP? Zaproponuj użycie '[^ (\\ x00 - \\ xFF)] + (?: $ | \\ s *)' i pozbycie się 'trim()'. – Quinn

3

Jeśli chcesz bardziej opisowego używając wyrażenia to:

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

lub przecięcie negacji [\P{InBasic_Latin}&&\P{InLatin-1Supplement}] (nie, że jest to bardziej czytelne;))

+0

Przetestowałem wszystkie odpowiedzi i wygląda na to, że to jedyny, który faktycznie zachowuje znak '$' (który jest częścią znaków Latin-1). – RoboticR

+0

@RoboticR używając '[^ \ x00- \ xFF]' zrobiłoby to samo. – Thomas

+0

Masz rację. Nie widziałem tego. – RoboticR

Powiązane problemy