Conjuntos e Intervalos em Regex do JavaScript
Aprenda a usar conjuntos e intervalos em expressões regulares do JavaScript para validar entradas, analisar texto e processar dados com eficiência.
As expressões regulares (regex) em JavaScript são uma ferramenta poderosa para processamento e manipulação de texto. Um conjunto de caracteres (ou classe de caracteres) permite dizer "corresponder a qualquer um desses caracteres" em uma única posição da string — um bloco fundamental usado constantemente na validação de entradas, análise de texto e limpeza de dados.
Este guia cobre conjuntos [...], intervalos como [a-z0-9], negação [^...], como escapar caracteres especiais dentro de um conjunto e como conjuntos se combinam com classes abreviadas como \w e \d. Cada exemplo é executável, então você pode confirmar o resultado por conta própria.
Introdução aos Conjuntos em Regex
Um conjunto em uma expressão regular especifica um grupo de caracteres, qualquer um dos quais pode corresponder a uma determinada posição na string de busca. Os conjuntos são escritos dentro de colchetes []. É fundamental que um conjunto corresponda a exatamente um caractere — [abc] corresponde a um único a, b ou c, não à string "abc".
Conjuntos Básicos
Por exemplo, o conjunto [abc] corresponde a qualquer caractere único que seja a, b ou c. Com a flag global g, match() retorna todos os caracteres encontrados:
Conjuntos Negados
Para criar um conjunto negado que corresponde a qualquer caractere não listado, coloque um circunflexo ^ imediatamente após o colchete de abertura. Por exemplo, [^abc] corresponde a qualquer caractere único exceto a, b ou c. O ^ só tem esse significado especial na primeira posição; em qualquer outro lugar é um circunflexo literal.
Entendendo os Intervalos
Dentro de um conjunto, você pode escrever um intervalo com um hífen — início-fim — em vez de listar cada caractere. Um intervalo corresponde a qualquer caractere cujo ponto de código esteja entre os dois extremos, inclusive. Isso mantém os padrões curtos e legíveis.
Intervalos Numéricos
Por exemplo, [0-9] representa qualquer dígito de 0 a 9. Adicionar + faz com que corresponda a um ou mais dígitos consecutivos, de modo que os dígitos consecutivos sejam agrupados em uma única correspondência:
Intervalos Alfabéticos
Da mesma forma, [a-z] corresponde a qualquer letra minúscula e [A-Z] a qualquer letra maiúscula. Você pode colocar vários intervalos em um conjunto — [A-Za-z0-9] cobre letras e dígitos — para corresponder a vários tipos de caracteres ao mesmo tempo:
Um uso prático comum é uma verificação básica de identificador, onde o primeiro caractere deve ser uma letra e os demais podem ser letras, dígitos ou underscores:
Uso Avançado de Conjuntos e Intervalos
Você pode incluir classes abreviadas diretamente em um conjunto junto com caracteres literais e intervalos. As abreviações se comportam da mesma forma dentro de [...] como fora:
\d— um dígito, equivalente a[0-9]\w— um caractere de "palavra":[A-Za-z0-9_]\s— espaço em branco (espaço, tabulação, nova linha, …)
Portanto, [\d.] significa "um dígito ou um ponto", e [\w-] significa "um caractere de palavra ou um hífen". Veja Classes de caracteres para a lista completa e as formas negadas em maiúsculas (\D, \W, \S).
Exemplo: Combinando Caracteres de Palavra e Símbolos Especiais
Aqui está um caso prático: manter caracteres de palavra e um sinal de pontuação específico, ignorando todo o resto.
Aqui, \w cobre todas as letras, dígitos e o underscore. Adicionar ! ao conjunto também corresponde ao ponto de exclamação, que \w não inclui. Isso é útil quando você quer permitir alguns símbolos específicos sem abrir a correspondência para toda a pontuação.
Suporte a Unicode e Múltiplos Idiomas
Intervalos como [a-z] cobrem apenas letras ASCII — eles não incluem caracteres acentuados e não latinos. Para corresponder a letras em todos os idiomas, use escapes de propriedade Unicode (ECMAScript 2018+) junto com a flag u. Por exemplo, \p{L} corresponde a qualquer tipo de letra de qualquer script:
A flag u é obrigatória para que \p{...} funcione. Saiba mais em A flag unicode "u" e a classe \p{...} e na visão geral de Padrões e flags.
Excluindo Intervalos em Expressões Regulares
A negação também funciona com intervalos. [^0-9] corresponde a qualquer caractere que não seja um dígito, e você pode misturar intervalos e caracteres individuais após o circunflexo. Uma tarefa frequente é remover ou encontrar tudo o que não está em um grupo permitido — aqui, cada caractere que não é uma vogal (a flag i torna a busca insensível a maiúsculas/minúsculas):
Exemplo de Exclusão de Intervalos
Essa regex encontrará todos os caracteres que não são vogais, incluindo pontuação e espaços. É uma maneira poderosa de filtrar caracteres indesejados de uma string.
Escapando Caracteres Especiais em Conjuntos
Dentro de um conjunto, muito menos caracteres são especiais do que fora. Você só precisa se preocupar com quatro: o colchete de fechamento ], a barra invertida \, o circunflexo ^ (especial apenas no início) e o hífen - (especial apenas entre dois caracteres). Escape qualquer um deles com uma barra invertida para usá-los literalmente.
Um atalho útil: um hífen é tratado como literal se for o primeiro ou último caractere no conjunto, então [-+] e [a-z-] não precisam de escape. Da mesma forma, caracteres que são especiais fora de um conjunto — como ., *, +, (, ) — perdem seu significado dentro dele e correspondem literalmente, então [.+] simplesmente corresponde a um ponto ou um sinal de mais.
Exemplo de Escape de Caracteres Especiais
Aqui os colchetes são escapados para que sejam lidos como caracteres literais em vez de abrir e fechar um conjunto. O próximo exemplo mostra a regra do hífen como literal e a regra do ponto que perde seu poder juntas:
Conclusão
Dominar conjuntos e intervalos em regex do JavaScript não apenas aprimora suas capacidades de manipulação de strings, mas também resulta em código mais limpo e eficiente. Eles são particularmente poderosos para analisar texto, validar entradas e processar dados no desenvolvimento web.