2013-06-28 8 views
5

Voglio abbinare questo personaggio nella lingua africana Yoruba 'ẹ'. Di solito ciò avviene combinando un 'é' con un '\ u0323' sotto punto diacritico. Ho trovato quello:Javascript Regex + Unicode Diacritic Combining Characters`

'é\u0323'.match(/[é]\u0323/) works but 
'ẹ́'.match(/[é]\u0323/) does not work. 

Non voglio solo abbinare e. Voglio abbinare tutte le combinazioni. In questo momento, la mia soluzione prevede l'enumerazione di tutte le combinazioni. Mi piace così: /[ÁÀĀÉÈĒẸE̩Ẹ́É̩Ẹ̀È̩Ẹ̄Ē̩ÍÌĪÓÒŌỌO̩Ọ́Ó̩Ọ̀Ò̩Ọ̄Ō̩ÚÙŪṢS̩áàāéèēẹe̩ẹ́é̩ẹ̀è̩ẹ̄ē̩íìīóòōọo̩ọ́ó̩ọ̀ò̩ọ̄ō̩úùūṣs̩]/

Potrebbe non esserci un modo più breve e quindi migliore per farlo, oppure la regex di corrispondenza in javascript di caratteri diacritici unicode combinati non funziona facilmente? Grazie

+0

Se devo essere onesto, preferirei piuttosto leggere e mantenere quella breve stringa di caratteri che decodificare e comprendere la parte \ uxxxx di una possibile regex più intelligente. L'utilizzo di una tabella di ricerca sarà sempre più rapido del calcolo di un carattere. Un modo possibile se la regex fallisce è quello di rendere il char in uno span e quindi confrontare – mplungjan

+0

Questo è un buon punto. Forse il modo attuale è migliore. – user2530580

+0

Ho finito con la parte \ uxxxx perché la modifica in vim ha molto più senso quando non ci sono punti unicode di larghezza variabile ovunque con direzioni di flusso diverse facendo cose meravigliose con la posizione del cursore: la sua posizione è diventata praticamente una variabile casuale . – user2530580

risposta

3

Di solito questo è fatto combinando una 'e' con un '\ u0323' sotto dot diacritic

Tuttavia, questo non è quello che hai qui:

'ẹ́' 

che è non U + 0065, U + 0323 ma U + 1EB9, U + 0301 - combinando uno con un segno diacritico acuto.

La soluzione usuale sarebbe quella di normalizzare ogni stringa (in genere in Unicode Normal Form C) prima di eseguire il confronto.

Non voglio solo abbinare e. Voglio abbinare tutte le combinazioni

L'abbinamento senza segni diacritici viene in genere eseguito normalizzando su Forma normale D e rimuovendo tutti i caratteri diacritici combinati.

Purtroppo la normalizzazione non è disponibile in JS, quindi se lo si desidera è necessario trascinare il codice per farlo, che dovrebbe includere una grande tabella di dati Unicode. Uno di questi è unorm. Per raccogliere i caratteri in base ai preoperties Unicode come se fossero un diacritico combinato, è necessario anche un motore con espressioni regolari con supporto per il database Unicode, ad esempio XRegExp Unicode Categories.

I linguaggi lato server (ad es. Python, .NET) hanno in genere il supporto nativo per la normalizzazione Unicode, quindi se è possibile eseguire l'elaborazione sul server in genere sarebbe più semplice.

+0

Questo lo spiega. Grazie – user2530580

+0

bobince quando hai un minuto puoi aggiornarlo per fare riferimento a '.normalize 'di ES6. – Sergio

4

Normalmente la soluzione sarebbe utilizzare Unicode properties and/or scripts, ma JavaScript non li supporta in modo nativo.

Ma esiste il lib XRegExp che aggiunge questo supporto. Con questa libreria puoi usare

\p{L}: per abbinare qualsiasi tipo di lettera da qualsiasi lingua.

\p{M}: un carattere destinato a essere combinato con un altro carattere (ad esempio accenti, dieresi, caselle di chiusura, ecc.).

Così la vostra classe di personaggio sarebbe simile a questa:

[\p{L}\p{M}]+ 

che sarebbe partita tutte le possibili lettere che sono nella tabella Unicode.

Se si desidera limitare, è possibile dare un'occhiata a Unicode script e sostituire \p{L} da uno script, raccolgono tutte le lettere da alcune lingue. per esempio. \p{Latin} per tutte le lettere latine o \p{Cyrillic} per tutte le lettere cirilliche.

+0

Vorrei andare avanti, questa potrebbe essere solo la libreria da usare. – user2530580