2016-03-16 20 views
6

Diciamo che ho il seguente codice:Java rimuovere i caratteri non latini-base dalla stringa

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

mi piacerebbe rimuovere i caratteri non latini: , , , , , e .

e farlo diventare tale: This description is a mess.

So che probabilmente c'è tonnellate di questi caratteri Wingdings-come, così invece di specificare quello che mi piacerebbe di rimuovere, penso che sia meglio elencare ciò che voglio tenere : Basic Latin e Latin-1 supplements caratteri.

ho trovato che posso utilizzare il seguente codice per rimuovere tutto, ma i caratteri latini di base

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

Ma c'è un modo per preservare anche i caratteri Latin-1 supplemento?

+3

Poiché sembra che tale intervallo viene subito dopo di base latin, non potresti semplicemente cambiare la regex con questo: '" [^ \\ x00 - \\ xFF] "'? – resueman

+0

@resueman questo suona come una risposta ... –

+0

Provare regex '\ p {S}', vedere il mio post sotto – Saleem

risposta

6

Guardando il carattere gamme che hai fornito, sembra che "Latino di base" e "Latin-1 Supplementi" sono adiacenti (0x00-0x7F e 0x80 - 0xFF).

Quindi è possibile utilizzare la stessa espressione regolare fornita, estesa solo per includere i caratteri "Supplemento Latin-1". Che sarebbe simile a questa:

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

Come sottolineato nei commenti da Quinn, questo non sbarazzarsi degli spazi tra le sezioni rimosse, quindi il risultato ha spazi in eccesso (che può o non può essere quello che volere). Se desideri rimuovere gli spazi, la regex di Quinn ([^(\\x00-\\xFF)]+(?:$|\\s*), nel caso in cui il commento venga eliminato) potrebbe funzionare per te.

+1

La stringa del risultato ha più spazi tra le parole. Il formato desiderato di questo OP? Suggerisci usando '[^ (\\ x00 - \\ xFF)] + (?: $ | \\ s *)', e sbarazzarsi di 'trim()'. – Quinn

3

Se si desidera un uso più descrittivo espressione questo:

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

o l'intersezione delle negazioni [\P{InBasic_Latin}&&\P{InLatin-1Supplement}] (non che è più leggibile;))

+0

Ho testato tutte le risposte e sembra che questo sia l'unico che conserva il carattere '$' (che fa parte dei caratteri supplementari Latin-1). – RoboticR

+0

@RoboticR usando '[^ \ x00- \ xFF]' farebbe lo stesso. – Thomas

+0

Hai ragione. Non l'ho visto. – RoboticR