2010-06-15 15 views
6

Sto cercando di mettere un'espressione regolare Java per dividere le stringhe del formato generale "foo - bar" in "foo" e "bar" con Pattern.split(). Il carattere "-" può essere uno dei tanti trattini: l'ASCII '-', il trattino lungo, l'en-dash, ecc ho costruito il seguente espressione regolare:Corrispondenza dei trattini Unicode nelle espressioni regolari Java?

private static final Pattern titleSegmentSeparator = Pattern.compile("\\s(\\x45|\\u8211|\\u8212|\\u8213|\\u8214)\\s"); 

che, se io Sto leggendo correttamente la documentazione Pattern, dovrei catturare qualsiasi trattino Unicode o il trattino ASCII, quando circondato da entrambi i lati da spazi bianchi. Sto usando il modello come segue:

String[] sectionSegments = titleSegmentSeparator.split(sectionTitle); 

Nessuna gioia. Per l'input di esempio riportato di seguito, il trattino non viene rilevato e titleSegmentSeparator.matcher (sectionTitle) .find() restituisce false!

Per assicurarsi che non mancasse alcuna entità di carattere insolita, ho utilizzato System.out per stampare alcune informazioni di debug. L'output è il seguente: ogni carattere è seguito dall'output di (int) char, che dovrebbe essere il suo 'code point unicode, no?

ingresso

Esempio:

Study Sintesi (1 di 10) - Competizione

S (83) t (116) u (117) d (100) y (121) (32) S (83) u (117) m (109) m (109) a (97) r (114) y (121) (32) ((40) 1 (49) (32) o (111) f (102) (32) 1 (49) 0 (48)) (41) (32) - (8211) (32) C (67) o (111) m (109) p (112) e (101) t (116) i (105) t (116) i (105) o (111) n (110)

mi sembra che il trattino sia codepoint 8211, che dovrebbe essere abbinato alla regex, ma non lo è! Cosa sta succedendo qui?

+0

Dalla documentazione: "le corde '\ u2014' e '\\ u2014', anche se non uguale, compilare nello stesso modello, che corrisponde al personaggio con 0x2014 valore esadecimale. " Cioè, puoi rimuovere il doppio \\ nella tua espressione. – aioobe

+0

@aioobe: Che enorme coincidenza che i documenti di Java hanno usato esattamente un carattere come un esempio che questa domanda è circa. O hai modificato la citazione? Coincidenza –

+2

:-) – aioobe

risposta

12

Stai mescolando decimale (8211) ed esadecimale (0x8211).

\x e \u entrambi si aspettano un numero esadecimale, quindi avresti bisogno di usare \u2014 per abbinare il trattino lungo, non \u8211 (e \x2D per il normale trattino ecc).

Ma perché non utilizzare semplicemente la proprietà Unicode "Punteggiatura dash"?

come una stringa Java: "\\s\\p{Pd}\\s"

+0

Ahimè, Java non supporta la proprietà Unicode 'Dash' nelle sue regex, che include cose come MINUS SIGN, che è di tipo Symbol. – tchrist

Problemi correlati