Regex sem medo: o básico que resolve 90% dos casos

Aprenda os blocos fundamentais das expressões regulares, como classes de caracteres, quantificadores, grupos e âncoras, usando exemplos reais e entendendo por que validar e-mail perfeito com regex é uma armadilha.


Regex tem fama de ilegível, e boa parte dela é merecida: uma expressão como ^(?=.*\d)(?=.*[a-z]).{8,}$ parece sopa de símbolos. Mas o que resolve a maior parte dos casos do dia a dia é um conjunto pequeno de blocos. No post do validador de senha e no de Zod apareceram regras desse tipo sem muita explicação, então vale montar a base.

O que é uma expressão regular

Uma regex é um padrão que descreve um formato de texto. Você escreve o formato e o motor diz se um texto combina com ele, ou extrai as partes que combinam.

const padrao = /gato/;
padrao.test("o gato subiu"); // true
padrao.test("o cachorro"); // false

Sem símbolos especiais, ela só procura aquele trecho literal. O poder aparece com os blocos a seguir.

Classes de caracteres

Em vez de um caractere exato, você descreve um conjunto:

  • \d é um dígito (0 a 9)
  • \w é letra, número ou underscore
  • \s é espaço em branco
  • . é qualquer caractere
  • [abc] é "a", "b" ou "c"
  • [a-z] é qualquer letra minúscula
/\d\d\d/.test("abc123"); // true, tem três dígitos seguidos
/[aeiou]/.test("rhythm"); // false, não tem vogal

Quantificadores: quantas vezes repetir

  • + é uma ou mais vezes
  • * é zero ou mais vezes
  • ? é opcional (zero ou uma vez)
  • {3} é exatamente 3 vezes
  • {2,4} é de 2 a 4 vezes
/\d+/.exec("pedido 4521 aprovado")[0]; // "4521"
/colou?r/.test("color"); // true, o "u" é opcional

Âncoras: o começo e o fim do texto

^ marca o início e $ marca o fim. Sem elas, a regex procura o padrão em qualquer ponto do texto:

/\d{4}/.test("ano 2026 chegou"); // true, achou 4 dígitos no meio
/^\d{4}$/.test("ano 2026 chegou"); // false, o texto inteiro não é só 4 dígitos
/^\d{4}$/.test("2026"); // true

Esquecer as âncoras é o erro mais comum de validação: o padrão "combina" porque achou um pedaço do texto, mesmo que o resto seja lixo.

Grupos: capturar partes

Parênteses agrupam e permitem extrair pedaços do que combinou:

const data = "2026-11-06";
const resultado = data.match(/^(\d{4})-(\d{2})-(\d{2})$/);
 
const [, ano, mes, dia] = resultado;
// ano = "2026", mes = "11", dia = "06"

Com grupos nomeados fica ainda mais legível:

const m = "2026-11-06".match(/^(?<ano>\d{4})-(?<mes>\d{2})-(?<dia>\d{2})$/);
m.groups.ano; // "2026"

Juntando: um exemplo útil

Validar um CEP brasileiro, com ou sem hífen:

const cep = /^\d{5}-?\d{3}$/;
cep.test("01310-100"); // true
cep.test("01310100"); // true
cep.test("0131-0100"); // false

Lendo em voz alta: começo, cinco dígitos, um hífen opcional, três dígitos, fim. Quando você consegue narrar a regex assim, ela deixou de ser sopa de símbolos.

A armadilha do e-mail

É tentador escrever uma regex pra validar e-mail, e a internet está cheia delas, cada uma maior que a anterior. O problema é que a especificação de e-mail é complicada o bastante pra uma regex completa passar de centenas de caracteres e ainda errar casos. Pior: um e-mail pode ter o formato perfeito e não existir.

Na prática, use algo simples só pra pegar erros óbvios de digitação:

const emailBasico = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

E confirme a validade de verdade enviando um e-mail com link de confirmação, exatamente o double opt-in que descrevi no post da newsletter. Regex valida formato, não existência.

Um cuidado: regex lenta

Algumas expressões com quantificadores aninhados, como (a+)+$, podem levar um tempo exponencial em certos textos, travando a thread do Node (o event loop de novo). Evite aplicar regex complexa direto em entrada do usuário sem limitar o tamanho do texto antes.

Fechando

Você não precisa decorar tudo. Com classes de caracteres, quantificadores, âncoras e grupos, dá pra resolver a maior parte do que aparece em validação e extração de texto. Escreva a regex em partes pequenas, teste cada uma com exemplos que devem e que não devem combinar, e lembre que ela valida o formato, nunca a verdade por trás dele.

Direto na sua
caixa de entrada.

Um aviso por e-mail sempre que eu publicar um post novo. Sem spam, sem newsletter chata, só isso.