Expressões Regulares Explicadas: Um Guia Prático para Desenvolvedores
Aprenda os 20% da sintaxe regex que cobrem 80% dos casos de uso do mundo real — classes de caracteres, quantificadores, âncoras, grupos e flags — com exemplos práticos de validação de e-mail, números de telefone, extração de URLs e mais.
Expressões regulares são uma daquelas ferramentas que os desenvolvedores ou adoram ou evitam completamente. Elas parecem intimidadoras — uma string densa de caracteres especiais que parece desafiar toda legibilidade — mas o modelo subjacente é simples. Uma vez que você entende como funcionam, uma regex bem elaborada se torna uma das ferramentas de linha única mais poderosas em todo o seu conjunto de ferramentas.
Este guia corta o ruído. Em vez de catalogar cada recurso de regex, ele se concentra nos 20% da sintaxe que cobre 80% dos casos de uso do mundo real: classes de caracteres, quantificadores, âncoras, grupos e flags. Ao longo do caminho, você pode testar cada exemplo no Testador de Regex do BrowseryTools — gratuito, sem cadastro, tudo fica no seu navegador.
O que É uma Expressão Regular?
Uma expressão regular é um padrão que descreve um conjunto de strings. Quando você aplica uma regex a um texto, está perguntando: "esta string corresponde ao meu padrão?" — ou mais praticamente: "encontre todas as substrings que correspondam ao meu padrão." O próprio padrão é escrito em uma mini-linguagem compacta que a maioria das linguagens de programação suporta nativamente.
As expressões regulares são úteis sempre que você precisar validar entrada (este é um endereço de e-mail válido?), extrair dados (puxar todas as URLs de um bloco de texto), transformar texto (substituir todas as ocorrências de um padrão) ou dividir uma string em um delimitador complexo. Elas rodam no navegador, no servidor, no terminal — em todo lugar.
A Sintaxe Principal: 20% que Cobre 80% dos Casos
Caracteres Literais e o Ponto
A maioria dos caracteres em uma regex corresponde a si mesmos. O padrão hello corresponde literalmente à string "hello". O ponto . é o curinga universal — corresponde a qualquer caractere único exceto uma nova linha. Portanto h.llo corresponde a "hello", "hallo", "hxllo" e assim por diante.
Classes de Caracteres
Colchetes definem uma classe de caracteres — um conjunto de caracteres onde qualquer um deles pode corresponder nessa posição.
[aeiou]— corresponde a qualquer vogal única[a-z]— corresponde a qualquer letra minúscula (sintaxe de intervalo)[A-Za-z0-9]— corresponde a qualquer caractere alfanumérico[^0-9]— o^dentro dos colchetes nega a classe; corresponde a qualquer coisa que NÃO seja um dígito
Classes de atalho cobrem os casos mais comuns: \d corresponde a qualquer dígito (mesmo que [0-9]), \w corresponde a qualquer caractere de palavra (letras, dígitos, sublinhado), e \s corresponde a qualquer espaço em branco. Seus inversos maiúsculos — \D, \W, \S— correspondem ao oposto.
Quantificadores
Os quantificadores controlam quantas vezes o elemento precedente deve aparecer.
*— zero ou mais vezes+— uma ou mais vezes?— zero ou uma vez (torna algo opcional){3}— exatamente 3 vezes{2,5}— entre 2 e 5 vezes (inclusive){3,}— 3 ou mais vezes
Por padrão, os quantificadores são gananciosos — correspondem ao máximo possível. Adicionar um ? após o quantificador o torna preguiçoso: .*? corresponde o mínimo possível. Essa distinção importa muito ao extrair conteúdo entre delimitadores.
Âncoras
Âncoras não correspondem a caracteres; correspondem a posições na string.
^— o início da string (ou início de uma linha no modo multilinha)$— o fim da string (ou fim de uma linha no modo multilinha)\b— um limite de palavra — a posição entre um caractere de palavra e um caractere que não é de palavra
Âncoras são essenciais para validação. Sem elas, o padrão \d+ corresponderia aos dígitos dentro de "abc123xyz". Com âncoras — ^\d+$ — só corresponde a strings que consistem inteiramente de dígitos.
Grupos e Alternância
Parênteses criam grupos de captura. Eles servem a dois propósitos: agrupar uma subexpressão para que um quantificador se aplique ao grupo inteiro, e capturar a substring correspondente para extração.
// Grupo com quantificador: corresponde a uma ou mais repetições de "ab"
/(ab)+/ → corresponde a "ab", "abab", "ababab"
// Alternância com |: corresponde a "cat" ou "dog"
/(cat|dog)/ → corresponde a "I have a cat" e "I have a dog"
// Grupo de captura nomeado
/(?<year>d{4})-(?<month>d{2})-(?<day>d{2})/Grupos não capturadores — (?:...) — agrupam sem capturar, o que é mais limpo quando você só precisa do comportamento de agrupamento e não precisa extrair o texto correspondido.
Exemplos Práticos
Validação de E-mail
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/Detalhando: ^ ancora ao início. [a-zA-Z0-9._%+-]+ corresponde à parte local (um ou mais caracteres permitidos). @ é um arroba literal. [a-zA-Z0-9.-]+ corresponde ao nome do domínio. \. é um ponto literal (escapado, já que . sem escape significa "qualquer caractere"). [a-zA-Z]{2,} corresponde ao TLD com pelo menos 2 letras. $ ancora ao final.
Número de Telefone (Formato EUA)
/^+?1?s?((?d{3})?[s.-]?)(d{3}[s.-]?d{4})$/Isso corresponde a formatos como 555-867-5309, (555) 867-5309, +1 555 867 5309 e 5558675309. O truque principal é usar ? para tornar os separadores opcionais e agrupar o código de área com parênteses opcionais.
Extraindo URLs de Texto
/https?://[^s"'<>]+/g
https? corresponde tanto a "http" quanto a "https" (o s é opcional). :\/\/ corresponde ao literal "://" com barras escapadas. [^\s"'<>]+ corresponde a tudo que não é espaço em branco ou caracteres comuns de encerramento de URL. A flag g encontra todas as correspondências, não apenas a primeira.
Flags de Regex
As flags modificam como o padrão inteiro é aplicado.
g(global) — encontra todas as correspondências, não apenas a primeirai(insensível a maiúsculas) — trata maiúsculas e minúsculas como equivalentes;/hello/icorresponde a "Hello", "HELLO" e "hello"m(multilinha) — faz^e$corresponderem ao início/fim de cada linha em vez da string inteiras(dotAll) — faz.também corresponder a novas linhas, útil para correspondência em quebras de linha
Em JavaScript, as flags vão após a barra de fechamento: /padrão/gi. Em Python, são passadas como segundo argumento: re.findall(padrão, texto, re.IGNORECASE).
JavaScript vs Python: Diferenças Principais
A sintaxe de regex é amplamente a mesma entre JavaScript e Python, mas há algumas diferenças importantes.
- Grupos nomeados: JavaScript usa
(?<nome>...), Python usa o mesmo. Ambos retornam grupos nomeados, mas os acessam de forma diferente —match.groups.nomeem JS,match.group('nome')em Python. - Lookahead / lookbehind: Ambos suportam
(?=...)(lookahead positivo) e(?!...)(lookahead negativo). Python também suporta lookbehinds de comprimento variável; motores JavaScript mais antigos não. - Unicode: JavaScript requer a flag
upara lidar com escapes de propriedades Unicode como\p{Letter}. O móduloredo Python lida com Unicode por padrão. - Strings brutas: Em Python, sempre use strings brutas (
r"\d+") para evitar escape duplo de barras invertidas. Em JavaScript, você usa a sintaxe literal/\d+/ou a string"\\d+"ao construir comnew RegExp().
Erros Comuns de Regex
- Retrocesso catastrófico — padrões como
(a+)+em uma string que não corresponde podem causar retrocesso exponencial, travando o motor. Evite quantificadores aninhados em padrões sobrepostos. - Esquecer de escapar o ponto —
3.14como padrão corresponde a "3X14" porque.é um curinga. Use3\.14para corresponder ao ponto literal. - Não ancorar padrões de validação — sem
^e$, um padrão destinado a validar a string inteira corresponderá a qualquer string que contenha o padrão como substring. - Usar regex para análise de HTML — regex não consegue lidar com estruturas arbitrariamente aninhadas. Use um parser HTML adequado (DOMParser no navegador, BeautifulSoup em Python) para HTML.
Teste Seus Padrões com Segurança no Navegador
Escrever regex em um editor sem ciclo de feedback é doloroso. Você escreve um padrão, executa seu código, vê falhar, ajusta o padrão, executa novamente. Um testador de regex ao vivo encurta esse ciclo — você vê as correspondências destacadas em tempo real enquanto digita.
O Testador de Regex do BrowseryTools permite que você escreva um padrão, cole strings de teste e veja todas as correspondências destacadas instantaneamente. Roda inteiramente no seu navegador, para que você possa testar com dados reais — logs, entrada do usuário, strings de produção — sem enviar nada a um servidor.
Resumo
As expressões regulares recompensam o tempo que você investe em aprendê-las. O vocabulário principal — classes de caracteres, quantificadores, âncoras, grupos e flags — é pequeno. Os padrões que você pode construir a partir dele são vastos. Comece com os exemplos deste guia, teste-os com suas próprias strings e a sintaxe se tornará intuitiva mais rapidamente do que você espera.
Try the Tools — 100% Free, No Sign-Up
Everything runs in your browser. No uploads. No accounts. No ads.
Explore All Tools →