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"); // falseSem 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 vogalQuantificadores: 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"); // trueEsquecer 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"); // falseLendo 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.
Leia também
- Tailwind CSS: vale a pena ou é só moda?5 de novembro de 2026 · 4 min
- Motion graphics com Opus 5.5: o que um prompt não conta4 de novembro de 2026 · 8 min
- Promises e async/await: pare de se perder no assíncrono4 de novembro de 2026 · 4 min
- HTTP/1.1, HTTP/2 e HTTP/3: o que mudou de verdade30 de outubro de 2026 · 4 min