Escape de classes de caracteres unicode: \p{...}, \P{...}
Um escape de classe de caracteres unicode é um tipo de escape de classe de caracteres que corresponde a um conjunto de caracteres especificado por uma propriedade Unicode. Este escape é suportado apenas no modo compatível com Unicode. Quando o marcador v
está habilitado, também pode ser usado para corresponder com textos de tamanho finito.
Experimente
Sintaxe
\p{propriedadeSolitaria}
\P{propriedadeSolitaria}
\p{propriedade=valor}
\P{propriedade=valor}
Parâmetros
propriedadeSolitaria
-
Nome ou valor de uma propriedade Unicode solitária, seguindo a mesma sintaxe como
valor
. Ela especifica o valor para a propriedadeGeneral_Category
(Categoria Geral), ou um nome binário de propriedade (en-US). No modov
, também pode ser uma propriedade Unicode binária de textos (en-US).Nota: A sintaxe ICU (en-US) permite omitir o nome da propriedade
Script
também, mas o JavaScript não suporta isso, porque na maioria dos casos a propriedadeScript_Extensions
é mais útil que aScript
. propriedade
-
O nome de uma propriedade Unicode. Deve ser composto de letras ASCII (
A–Z
,a–z
) e underscores (_
), e deve ser um dos nome de propriedades não binárias (en-US). valor
-
O valor de uma propriedade Unicode. Deve ser composto de letras (
A–Z
,a–z
), underscores (_
), e dígitos (0–9
), e deve ser um dos valores suportados listados emPropertyValueAliases.txt (en-US)
.
Descrição
\p
e \P
são suportados apenas no modo compatível com Unicode. No modo compatível com Unicode, eles são escapes de caracteres para o caractere p
ou P
.
Todo caracter Unicode possui um conjunto de propriedades que o descreve. Por exemplo, o caracter a (en-US)
possui a propriedade General_Category
com o valor Lowercase_Letter
, e a propriedade Script
com o valor Latn
. As sequências de escape \p
e \P
permitem encontrar caracteres com base em suas propriedades. Por exemplo, a
pode corresponder a \p{Lowercase_Letter}
(o nome da propriedade General_Category
é opcional) assim como \p{Script=Latn}
. \P
cria uma classe complementar que consiste de pontos de código sem a propriedade especificada.
Para compor múltiplas propriedades, use a sintaxe de intersecção de conjunto de caracteres habilitada com o marcador v
, ou veja padrão de subtração e intersecção.
No modo v
, \p
pode corresponder a uma sequências de pontos de código, definida no Unicode como "propriedades de textos". Isto é mais útil para emojis, que são frequentemente compostos por múltiplos pontos de código. Contudo, \P
pode apenas complementar as propriedades do caracter.
Nota: Existem planos de portar a funcionalidade de propriedades de texto para o modo u
também.
Exemplos
Categorias gerais
Categorias gerais são utilizada para classificar caracteres Unicode e subcategorias estão disponíveis para definir uma categorização mais precisa. É possível utilizar ambas as formas, curta ou longa, no escape de uma propriedade Unicode.
Elas podem ser utilizadas para corresponder a letras, números, símbolos, pontuações, espaços, etc. Para uma lista mais extensa de categorias gerais, por favor consulte a especificação Unicode (en-US).
// encontrando todas as letras de um texto
const estoria =
"É o Gato Listrado: agora eu deve ter alguém com quem conversar.";
// Forma mais explícita
estoria.match(/\p{General_Category=Letter}/gu);
// Não é obrigatório usar o nome da propriedade para categorias gerais
estoria.match(/\p{Letter}/gu);
// Isso é equivalente (forma curta):
estoria.match(/\p{L}/gu);
// Isso também é equivalente (conjunção de todas as subcategorias usando a forma curta)
estoria.match(/\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}/gu);
Escritas e extensões de escritas
Algumas linguagens utilizam escritas diferentes para escrever seus sistemas. Por exemplo, inglês e espanhol são escritos utilizando latim enquanto árabe e russo são escritos utilizando outras escritas (respectivamente árabe e cirílico). As propriedades Unicode Script
e Script_Extensions
permitem que expressões regulares correspondam com caracteres de acordo com a escrita com a qual elas são amplamente utilizadas (Script
) ou de acordo com o conjunto de escritas as quais elas pertencem (Script_Extensions
).
Por exemplo, A
pertence a escrita Latin
(latim) e ε
a escrita Greek
(Grega).
const caracteresMisturados = "aεЛ";
// Utilizando o canonico nome "longo" da escrita
caracteresMisturados.match(/\p{Script=Latin}/u); // a
// Utilizando a forma curta (código ISO 15924) para a escrita
caracteresMisturados.match(/\p{Script=Grek}/u); // ε
// Utilizando o nome curto sc para a propriedade Script
caracteresMisturados.match(/\p{sc=Cyrillic}/u); // Л
Para mais detalhes, consulte a especificação Unicode (en-US), a especificação ECMAScript da tabela de escritas (en-US), e a lista de códigos de escritas ISO 15924 (en-US).
Se o caracter é utilizado em um conjunto limitado de escritas, a propriedade Script
vai apenas combinar para a escrita "predominantemente" utilizada. Se nós queremos que os caracteres correspondam com base na escrita "não predominante", nós podemos utilizar a propriedade Script_Extensions
(Scx
para a forma curta).
// ٢ é o dígito 2 na notação Árabe-Índico
// enquanto ela é predominantemente escrita com a escrita Árabe
// ela ainda pode ser escrita na escrita Thaana
"٢".match(/\p{Script=Thaana}/u);
// null já que Thaana não é a escrita predominante
"٢".match(/\p{Script_Extensions=Thaana}/u);
// ["٢", index: 0, input: "٢", groups: undefined]
Escape de propriedades Unicode vs. Classes de caracteres
Com expressões regulares no JavaScript, também é possível usar classes de caracteres e especialmente \w
ou \d
que correspondem a letras ou dígitos. Contudo, essas formas apenas correspondem a caracteres da escrita Latin (em outras palavras, de a
à z
e de A
à Z
para \w
e de 0
à 9
para \d
). Conforme mostrado neste exemplo, o trabalho com textos que não seguem a escrita Latim pode ser um pouco desajeitado.
Categorias de escape de propriedades Unicode abrangem muito mais caracteres e \p{Letter}
ou \p{Number}
vai funcionar para qualquer escrita.
// Tentando usar faixas de valores para evitar as limitações do \w:
const textoQueNaoELatim = "Приключения Алисы в Стране чудес";
const regexpPalavraBMP = /([\u0000-\u0019\u0021-\uFFFF])+/gu;
// BMP vai de U+0000 à U+FFFF mas o espaço é U+0020
console.table(textoQueNaoELatim.match(regexpPalavraBMP));
// Usando escapes de propriedades Unicode ao invés disso
const regexpUPE = /\p{L}+/gu;
console.table(textoQueNaoELatim.match(regexpUPE));
Correspondendo à preços
O exemplo a seguir corresponde a preços em um texto:
function pegarPrecos(str) {
// Sc significa "currency symbol" (Símbolo de moeda)
return [...str.matchAll(/\p{Sc}\s*[\d.,]+/gu)].map((match) => match[0]);
}
const str = `Rolinhos California $6.99
Rolinhos crocantes $8.49
Tempura de camarão $10.99`;
console.log(pegarPrecos(str)); // ["$6.99", "$8.49", "$10.99"]
const str2 = `Loja nos EUA $19.99
Loja na Europa €18.99
Loja no Japão ¥2000`;
console.log(pegarPrecos(str2)); // ["$19.99", "€18.99", "¥2000"]
Correspondendo à textos
Com o marcador v
, \p{…}
pode corresponder a textos que são potencialmente mais longos do que um caracter utilizando as propriedades de textos:
const marcador = "🇺🇳";
console.log(marcador.length); // 2
console.log(/\p{RGI_Emoji_Flag_Sequence}/v.exec(marcador)); // [ '🇺🇳' ]
Contudo, você não pode usar \P
para corresponder a "um texto que não tem uma propriedade", porque não é claro quantos caracteres devem ser usados.
/\P{RGI_Emoji_Flag_Sequence}/v; // SyntaxError: Invalid regular expression: Invalid property name
Especificações
Specification |
---|
ECMAScript Language Specification # prod-CharacterClassEscape |
Compatibilidade com navegadores
BCD tables only load in the browser
Veja também
- Guia Classes de caracteres
- Expressões regulares
- Classe de caracter:
[...]
,[^...]
- Espace de classe de caracter:
\d
,\D
,\w
,\W
,\s
,\S
- Escape de caracter:
\n
,\u{...}
- Disjunção:
|
- Propriedade de caracter Unicode (en-US) na Wikipédia
- ES2018: Escapes de propriedades de RegExp Unicode (en-US) por Dr. Axel Rauschmayer (2017)
- Propriedades § de expressões regulares Unicode (en-US)
- Utilidades do Unicode: UnicodeSet (en-US)
- RegExp marcador v com conjunto de notações e propriedades de texto (en-US) no v8.dev (2022)