A Flag v do RegExp: Operações de Conjunto em Classes de Caracteres

Como o modo unicodeSets do ES2024 traz união, interseção e subtração para classes de caracteres, além de reconhecer sequências Unicode multi-code-point como emojis compostos como uma única unidade.

Desde o ES2015, a flag u deixou as regex "conscientes" de Unicode, mas ela nunca resolveu dois problemas: não dava para combinar classes de caracteres com operações de conjunto (união, interseção, subtração), e não dava para tratar como "um caractere só" sequências Unicode formadas por vários code points, como emojis compostos. O ES2024 trouxe a flag v (modo unicodeSets) para resolver exatamente isso — uma extensão da u, não um substituto.

Como ativar

Basta trocar a flag u por v ao criar a regex. As duas são mutuamente exclusivas — usar ambas ao mesmo tempo lança SyntaxError:

const antiga = /\p{Emoji}/u;
const nova = /\p{Emoji}/v;

const invalida = /\p{Emoji}/uv; // SyntaxError: Invalid regular expression flags

Subtração de conjuntos com --

O operador -- dentro de uma classe de caracteres remove os itens do segundo conjunto do primeiro. Um uso clássico é isolar dígitos decimais que não sejam os dígitos ASCII comuns:

const digitoNaoAscii = /[\p{Decimal_Number}--[0-9]]/v;

digitoNaoAscii.test('٣'); // true  — dígito arábico-índico
digitoNaoAscii.test('3'); // false — é um dígito ASCII, foi subtraído

Interseção de conjuntos com &&

O operador && mantém apenas o que existe nos dois conjuntos ao mesmo tempo. Aqui, restringimos as letras à escrita grega, descartando outros símbolos que também pertencem ao bloco grego, mas não são letras:

const letraGrega = /[\p{Script=Greek}&&\p{Letter}]/v;

letraGrega.test('π'); // true
letraGrega.test('☧'); // false — símbolo do bloco grego, mas não é "Letter"

Não é possível misturar && e -- no mesmo nível de uma classe — o motor exige que você agrupe explicitamente com colchetes aninhados para deixar a precedência sem ambiguidade.

Sequências literais com \q{...}

Antes da flag v, uma classe de caracteres só podia casar um único caractere por vez — para casar palavras inteiras como alternativas, era preciso recorrer a grupos de alternância como (?:red|green|blue). O novo \q{...} permite colocar strings de múltiplos caracteres dentro de uma classe:

const corValida = /^[\q{red|green|blue}]$/v;

corValida.test('red');   // true
corValida.test('green'); // true
corValida.test('r');     // false — "r" sozinho não está na lista

Propriedades de strings: emojis compostos

Muitos emojis não são um único code point — a bandeira do Brasil, por exemplo, é formada por dois "regional indicator symbols" combinados. Com a flag u, propriedades como \p{Emoji} só reconhecem um code point isolado, então testar a sequência inteira falha. A flag v introduz propriedades de strings, como \p{RGI_Emoji_Flag_Sequence}, que casam a sequência completa como uma única unidade:

const bandeiraBrasil = '🇧🇷';

/^\p{Emoji}$/u.test(bandeiraBrasil);                  // false — são 2 code points
/^\p{RGI_Emoji_Flag_Sequence}$/v.test(bandeiraBrasil); // true  — reconhecida como uma unidade

Quando usar

Cuidados

Sintaxe que antes era tolerada dentro de colchetes agora é mais estrita: caracteres como (, ), [, ], {, }, /, - e | precisam ser escapados com mais cuidado em certas posições, já que passaram a ter significado especial para a nova sintaxe de conjuntos. Migrar uma regex existente de u para v nem sempre é trivial — vale testar bem antes de trocar a flag em produção.

Compatibilidade

A flag v faz parte do ECMAScript 2024 e já tem suporte amplo em navegadores modernos (Chrome/Edge 112+, Firefox 116+, Safari 17+) e no Node.js 20+. Como sempre, vale conferir o alcance do suporte se o projeto precisar rodar em ambientes mais antigos.

caniuse

Conclusão

A flag v transforma classes de caracteres de uma simples lista de itens em uma álgebra de conjuntos de verdade, com união, interseção e subtração, além de finalmente permitir tratar sequências Unicode multi-code-point como unidades únicas. Para regex que lidam com texto internacionalizado ou emojis, ela substitui gambiarras antigas por uma sintaxe declarativa e muito mais precisa.

Tecnologia:
js

Deixe seu Comentário!

Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.

Comentário
Nome
Email
lock Seu e-mail não será publicado.