Comprendere Unicode in JavaScript: flag e classi
Impara il flag regex "u" di JavaScript per gestire correttamente i code point e le coppie surrogate, più gli escape di proprietà Unicode \p{...} e \P{...}.
Introduzione a Unicode
JavaScript supporta Unicode, uno standard di codifica dei caratteri che consente la rappresentazione di testo proveniente da più lingue e sistemi di scrittura. Unicode è essenziale per sviluppare applicazioni internazionalizzate e gestire efficacemente dati di testo diversificati. In questo capitolo esploreremo i flag e le classi Unicode in JavaScript, esaminandone l'utilizzo e fornendo esempi pratici per migliorare la comprensione.
Il flag Unicode u
Il flag u abilita la corrispondenza Unicode completa nelle espressioni regolari. Per impostazione predefinita, una regex tratta una string come una sequenza di unità di codice UTF-16. I caratteri al di fuori del Piano Multilingue Base (BMP) — emoji, molti simboli matematici e script più rari — vengono memorizzati come coppia surrogata: due unità di codice che insieme codificano un singolo code point. Senza il flag u, il motore regex vede queste due metà separatamente, il che compromette ., gli intervalli di caratteri e i quantificatori per tali caratteri.
Con il flag u impostato, il motore lavora in termini di code point anziché di unità di codice, quindi un singolo carattere astrale conta come un unico carattere.
Coppie surrogate e perché il flag è importante
. corrisponde a un singolo carattere. Senza u, corrisponde solo a una unità di codice, quindi non può abbinare da solo un intero carattere astrale.
😀 è la coppia surrogata per 😀. String#length riporta 2 perché conta le unità di codice, mentre espandendo la string in un array (che itera per code point) si ottiene 1. Senza u, /^.$/ fallisce perché . corrisponde solo a una delle due metà; con u corrisponde all'intero carattere.
Utilizzo del flag u
Qui 👍 è l'emoji del pollice su. Senza il flag u, la regex a.b non può corrispondere perché . consuma solo metà della coppia surrogata. Con il flag u, . consuma l'intero code point, quindi il pattern trova una corrispondenza.
Contare i caratteri correttamente
Una regex con il flag u e il flag g permette di iterare sui caratteri reali, inclusi quelli astrali.
Combinare il flag u con altri flag
Il flag u si combina con gli altri flag. Questo esempio aggiunge globale (g) e insensibile alle maiuscole (i).
Questo esempio illustra come combinare il flag u con i flag globale (g) e insensibile alle maiuscole (i). La regex corrisponde correttamente ad A👍b, dimostrando come il flag u possa essere usato con altri flag per una corrispondenza più flessibile.
Escape di proprietà Unicode: \p{...} e \P{...}
Gli escape di proprietà Unicode forniscono un modo per abbinare i caratteri in base alle loro proprietà Unicode. Questa funzionalità, introdotta in ECMAScript 2018, semplifica il lavoro con tipi specifici di caratteri.
Sintassi degli escape di proprietà Unicode
\p{Property=Value}: Corrisponde ai caratteri con la proprietà specificata.\P{Property=Value}: Corrisponde ai caratteri privi della proprietà specificata.
Proprietà Unicode comuni
Per le categorie generali a singola lettera, puoi scrivere direttamente il nome della proprietà: \p{L} è l'abbreviazione di \p{General_Category=Letter}.
- Categoria generale: Corrisponde ai caratteri in base alla loro categoria generale.
\p{L}(Lettera): Corrisponde a qualsiasi lettera, in qualsiasi script.\p{N}(Numero): Corrisponde a qualsiasi carattere numerico.\p{P}(Punteggiatura): Corrisponde alla punteggiatura.\p{Lu}/\p{Ll}: Lettere maiuscole / minuscole.
- Script: Corrisponde ai caratteri appartenenti a un sistema di scrittura.
\p{Script=Greek}(o\p{sc=Greek}): Caratteri greci.\p{Script=Han}: Caratteri Han (cinese, giapponese, coreano).\p{Script=Cyrillic}: Caratteri cirillici.
- Proprietà binarie: Corrispondono ai caratteri che hanno una determinata caratteristica.
\p{Emoji},\p{Emoji_Presentation}: Caratteri emoji.\p{White_Space}: Spazi bianchi.
La forma con lettera maiuscola \P{...} è la negazione — corrisponde a ogni carattere che non ha la proprietà. Per una trattazione più approfondita della forma con parentesi quadre [...], consulta le classi di caratteri.
Esempi di escape di proprietà Unicode
Qui, \p{L} corrisponde a qualsiasi lettera. La regex \p{L}+ trova tutte le sequenze di lettere nella string 'Hello123', restituendo ["Hello"].
In questo esempio, \p{N} corrisponde a qualsiasi numero. La regex \p{N}+ estrae tutte le sequenze numeriche dalla string 'Hello123', ottenendo ["123"].
\P{L} è l'inverso di \p{L}, quindi \P{L}+ cattura le sequenze che non contengono lettere — in questo caso "123!".
Questo esempio usa \p{Script=Greek} per abbinare caratteri greci. La regex corrisponde con successo alla string greca 'αβγδε'.
Abbinare le emoji
Poiché \p{...} richiede u, gestisce correttamente anche le emoji astrali — ogni emoji viene trattata come un singolo carattere.
L'uso degli escape di proprietà Unicode può influire sulle prestazioni, specialmente con grandi quantità di testo. Ottimizza le tue espressioni regolari e verifica le loro prestazioni nel tuo caso d'uso specifico.
Applicazioni pratiche
Validazione dell'input utente
Gli escape di proprietà Unicode possono validare l'input dell'utente in modo più preciso, garantendo che vengano accettati solo i caratteri consentiti.
Questa regex garantisce che un nome utente valido inizi con almeno due lettere, seguite da qualsiasi combinazione di lettere e numeri. 'User123' supera la validazione, mentre '123User' no.
Estrazione di caratteri specifici
Puoi estrarre tipi specifici di caratteri da una string usando gli escape di proprietà Unicode.
In questo esempio, \p{L}+ corrisponde a tutte le sequenze di lettere nella string 'Hello, κόσμε!', restituendo ["Hello", "κόσμε"].
Usa sempre il flag u con gli escape di proprietà Unicode
Quando utilizzi gli escape di proprietà Unicode, abilita sempre il flag u per garantire una corrispondenza corretta. Senza questo flag, gli escape di proprietà genereranno un SyntaxError.
Conclusione
Comprendere e utilizzare Unicode in JavaScript è fondamentale per sviluppare applicazioni robuste e internazionalizzate. Sfruttando il flag u e gli escape di proprietà Unicode, puoi gestire dati di testo diversificati in modo più efficace e ottenere una corrispondenza precisa dei caratteri. Integra queste tecniche nei tuoi progetti per migliorarne la funzionalità e garantire che soddisfino gli standard globali.