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
- Validar entrada de texto internacionalizado sem depender de faixas de código escritas à mão (ex: "dígitos que não sejam ASCII", "letras de um alfabeto específico").
- Detectar ou filtrar emojis corretamente, incluindo sequências compostas como bandeiras e emojis com modificadores de tom de pele.
- Construir listas de tokens válidos (comandos, unidades, palavras-chave) direto na classe de caracteres, sem grupos de alternância.
- Simplificar regex que hoje combinam várias propriedades Unicode manualmente com alternância
|, trocando por operações de conjunto explícitas e mais legíveis.
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.
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.
0 Comentário
Deixe seu Comentário!
Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.