Entendendo Unicode em JavaScript: Flags e Classes
Aprenda a flag "u" do regex JavaScript para tratamento correto de code points e pares substitutos, além de escapes de propriedade Unicode \p{...} e \P{...}.
Introdução ao Unicode
O JavaScript suporta Unicode, um padrão de codificação de caracteres que permite a representação de texto de múltiplos idiomas e sistemas de escrita. O Unicode é essencial para o desenvolvimento de aplicações internacionalizadas e para o tratamento eficaz de dados textuais diversos. Neste capítulo, exploraremos as flags e classes Unicode em JavaScript, examinando seu uso e fornecendo exemplos práticos para aprimorar sua compreensão.
A Flag Unicode u
A flag u habilita a correspondência Unicode completa em expressões regulares. Por padrão, um regex trata uma string como uma sequência de unidades de código UTF-16. Caracteres fora do Plano Multilíngue Básico (BMP) — emoji, muitos símbolos matemáticos e sistemas de escrita mais raros — são armazenados como um par substituto: duas unidades de código que juntas codificam um único code point. Sem a flag u, o mecanismo de regex vê esses dois fragmentos separadamente, o que quebra ., intervalos de caracteres e quantificadores para tais caracteres.
Com a flag u ativada, o mecanismo trabalha em termos de code points em vez de unidades de código, portanto um único caractere astral conta como um caractere.
Pares substitutos e por que a flag importa
. corresponde a um único caractere. Sem u, ela corresponde apenas a uma unidade de código, portanto não consegue corresponder a um caractere astral inteiro por si só.
😀 é o par substituto para 😀. String#length retorna 2 porque conta unidades de código, enquanto distribuir a string em um array (que itera por code point) retorna 1. Sem u, /^.$/ falha porque . corresponde apenas a uma das duas metades; com u, corresponde ao caractere completo.
Usando a Flag u
Aqui, 👍 é o emoji de polegar para cima. Sem a flag u, o regex a.b não consegue corresponder porque . consome apenas metade do par substituto. Com a flag u, . consome o code point inteiro, portanto o padrão corresponde.
Contando caracteres corretamente
Um regex com a flag u combinada com a flag g permite iterar sobre caracteres reais, incluindo os astrais.
Combinando a Flag u com Outras Flags
A flag u pode ser composta com as demais flags. Este exemplo adiciona global (g) e sem diferenciação de maiúsculas/minúsculas (i).
Este exemplo demonstra a combinação da flag u com as flags global (g) e sem distinção de maiúsculas (i). O regex corresponde a A👍b corretamente, ilustrando como a flag u pode ser usada com outras flags para uma correspondência mais flexível.
Escapes de Propriedade Unicode: \p{...} e \P{...}
Os escapes de propriedade Unicode fornecem uma maneira de corresponder caracteres com base em suas propriedades Unicode. Esse recurso, introduzido no ECMAScript 2018, facilita o trabalho com tipos específicos de caracteres.
Sintaxe dos Escapes de Propriedade Unicode
\p{Property=Value}: Corresponde a caracteres com a propriedade especificada.\P{Property=Value}: Corresponde a caracteres sem a propriedade especificada.
Propriedades Unicode Comuns
Para categorias gerais de uma letra, você pode escrever o nome da propriedade diretamente: \p{L} é abreviação de \p{General_Category=Letter}.
- Categoria Geral: Corresponde a caracteres com base em sua categoria geral.
\p{L}(Letter): Corresponde a qualquer letra, em qualquer sistema de escrita.\p{N}(Number): Corresponde a qualquer caractere numérico.\p{P}(Punctuation): Corresponde a pontuação.\p{Lu}/\p{Ll}: Letras maiúsculas / minúsculas.
- Script: Corresponde a caracteres pertencentes a um sistema de escrita.
\p{Script=Greek}(ou\p{sc=Greek}): Caracteres gregos.\p{Script=Han}: Caracteres Han (chinês, japonês, coreano).\p{Script=Cyrillic}: Caracteres cirílicos.
- Propriedades binárias: Correspondem a caracteres que possuem uma determinada característica.
\p{Emoji},\p{Emoji_Presentation}: Caracteres emoji.\p{White_Space}: Espaço em branco.
A forma com letra maiúscula \P{...} é a negação — corresponde a todo caractere que não possui a propriedade. Para uma cobertura mais aprofundada da forma entre colchetes [...], consulte classes de caracteres.
Exemplos de Escapes de Propriedade Unicode
Aqui, \p{L} corresponde a qualquer letra. O regex \p{L}+ encontra todas as sequências de letras na string 'Hello123', retornando ["Hello"].
Neste exemplo, \p{N} corresponde a qualquer número. O regex \p{N}+ extrai todas as sequências numéricas da string 'Hello123', resultando em ["123"].
\P{L} é o inverso de \p{L}, portanto \P{L}+ captura as sequências que não contêm letras — aqui "123!".
Este exemplo usa \p{Script=Greek} para corresponder a caracteres gregos. O regex corresponde com sucesso à string grega 'αβγδε'.
Correspondendo emoji
Como \p{...} requer u, ele também trata emoji astrais corretamente — cada emoji é tratado como um único caractere.
O uso de escapes de propriedade Unicode pode impactar o desempenho, especialmente com grandes volumes de dados textuais. Otimize suas expressões regulares e teste seu desempenho no seu caso de uso específico.
Aplicações Práticas
Validando Entrada do Usuário
Os escapes de propriedade Unicode podem validar a entrada do usuário com mais precisão, garantindo que apenas os caracteres permitidos sejam aceitos.
Este regex garante que um nome de usuário válido comece com pelo menos duas letras, seguidas de qualquer combinação de letras e números. 'User123' passa na validação, enquanto '123User' não passa.
Extraindo Caracteres Específicos
Você pode extrair tipos específicos de caracteres de uma string usando escapes de propriedade Unicode.
Neste exemplo, \p{L}+ corresponde a todas as sequências de letras na string 'Hello, κόσμε!', retornando ["Hello", "κόσμε"].
Sempre use a Flag u com Escapes de Propriedade Unicode
Ao usar escapes de propriedade Unicode, sempre habilite a flag u para garantir a correspondência correta. Sem essa flag, os escapes de propriedade lançarão um SyntaxError.
Conclusão
Compreender e utilizar o Unicode em JavaScript é essencial para o desenvolvimento de aplicações robustas e internacionalizadas. Ao aproveitar a flag u e os escapes de propriedade Unicode, você pode lidar com dados textuais diversos de forma mais eficaz e realizar correspondências de caracteres precisas. Incorpore essas técnicas em seus projetos para aprimorar sua funcionalidade e garantir que atendam aos padrões globais.