W3docs

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ó.

javascript— editable

😀 é 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

javascript— editable

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.

javascript— editable

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).

javascript— editable

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}.

  1. 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.
  2. 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.
  3. 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

javascript— editable

Aqui, \p{L} corresponde a qualquer letra. O regex \p{L}+ encontra todas as sequências de letras na string 'Hello123', retornando ["Hello"].

javascript— editable

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"].

javascript— editable

\P{L} é o inverso de \p{L}, portanto \P{L}+ captura as sequências que não contêm letras — aqui "123!".

javascript— editable

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.

javascript— editable
Aviso

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.

javascript— editable

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.

javascript— editable

Neste exemplo, \p{L}+ corresponde a todas as sequências de letras na string 'Hello, κόσμε!', retornando ["Hello", "κόσμε"].

Informação

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.

javascript— editable

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.

Prática

Prática
O que a flag 'u' nas expressões regulares do JavaScript altera?
O que a flag 'u' nas expressões regulares do JavaScript altera?
Was this page helpful?