design

Regex Tester & Pattern Builder: Um Guia Prático para Padrões que Realmente Funcionam

Como criar expressões regulares que realmente funcionam: âncoras, quantificadores, as armadilhas entre motores e o padrão ReDoS que pode travar seu servidor. Teste enquanto escreve.

Published 2026-06-22 · 9 min read

Affiliate disclosure

Some links below are affiliate links. I may earn a commission from qualifying purchases at no extra cost to you. I only recommend tools I have used or tested.

ferramenta de desenvolvedor testador de regex e construtor de padrões — ilustração original da capa
Photo by Generated with AI on Unsplash

TL;DR

  • Teste antes de publicar: um testador de regex pega erros que o achismo deixaria passar. Padrões quebram de maneiras que você não consegue prever sem executá-los.
  • Os motores divergem: \d captura mais de 600 dígitos Unicode no Python, mas apenas ASCII 0–9 no PCRE (a menos que você ative a flag). A sintaxe e o suporte do lookbehind variam. Teste seu regex no motor que você vai usar de verdade.
  • Cuidado com o backtracking catastrófico: padrões como ^(a+)+$ podem travar ou dar timeout quando a entrada não corresponde, porque o motor explora caminhos exponenciais. Use um motor de tempo linear como o RE2 para entradas não confiáveis.

Por que usar um testador de regex é melhor que ficar chutando?

Regex é apenas leitura até você testar. Um padrão que parece perfeito na sua cabeça costuma falhar quando esbarra em strings reais: ele captura demais, de menos, ou o motor dá timeout. A abordagem de testar primeiro resolve isso antes que vá para produção. Um testador de regex permite colar o padrão, alimentar com strings de teste e ver exatamente o que captura e quais grupos de extração retornam. A ferramenta da anytools roda o motor JavaScript direto no seu navegador (nada sai da página), mostra os grupos nomeados e numerados, deixa você alternar flags como g, i, m e s, e tem um modo de substituição para testar trocas. Você observa o comportamento em vez de apenas imaginá-lo.

A outra vantagem é a velocidade. Em vez de escrever código, rodar a suíte de testes e esperar o resultado, você tem um feedback instantâneo no navegador. Edita o padrão, vê reavaliar e itera em segundos. Quando você finalmente levar o regex para o código de produção, já sabe que ele funciona nas entradas que importam.

Os blocos de construção — o que um padrão realmente faz

Antes de escrever um regex que funcione, você precisa entender o que cada peça faz e onde elas te enganam.

Âncoras travam sua correspondência nas bordas. ^ casa com o início da string (ou da linha, se a flag multiline estiver ativa) e $ casa com o final. Sem eles, 123 vai corresponder dentro de "prefix123suffix". Com eles, ^123$ captura apenas a string "123" exata. Um erro clássico: esquecer as âncoras e se perguntar por que o padrão pega coisas que não deveria. O pulo do gato é que o sentido de ^ e $ muda com a flag multiline — o JavaScript exige a flag /m para que eles casem com limites de linha em vez de limites da string segundo a MDN.

Classes de caracteres definem o que pode casar. [a-z] significa "uma letra minúscula". [0-9] significa um dígito. \d é um atalho para dígitos, mas aí mora a armadilha: no Python 3, \d captura qualquer dígito decimal Unicode, incluindo arábico-indico (٠١٢) e devanágari (०१٢), e não apenas 0–9. No PCRE, o padrão é apenas ASCII [0-9], a menos que a flag PCRE2_UCP esteja ativada segundo a docs do Python. Se seu código espera que \d signifique 0–9 e você o porta para o Python, ele vai começar a capturar silenciosamente caracteres que você nunca planejou.

Quantificadores dizem quantas vezes repetir. + significa uma ou mais. * significa zero ou mais. ? significa zero ou um. {2,5} significa entre 2 e 5 vezes. Por padrão, eles são gulosos (greedy) — correspondem ao máximo de caracteres possível. O padrão <div>.*</div> vai capturar do primeiro <div> até o último </div> na string, engolindo tudo no meio. O Rexegg documenta que adicionar ? torna um quantificador preguiçoso (lazy): <div>.*?</div> para no primeiro </div>. Para casos simples, os quantificadores preguiçosos parecem a solução, mas não são bala de prata. Um quantificador preguiçoso ainda faz backtracking e, se a tag de fechamento não existir, o motor vai explorar vários caminhos antes de desistir, o que pode acionar a armadilha ReDoS abaixo.

Grupos de captura extraem partes da correspondência. Envolver um padrão entre parênteses, como (\d+)-(\w+), cria dois grupos de captura. Após o match, você pode pegar a correspondência inteira e cada grupo separadamente. Grupos de captura nomeados, como (?<day>\d+)-(?<month>\w+), rotulam os grupos para que você não precise contá-los — código mais limpo, menos bugs de off-by-one. O JavaScript suporta grupos nomeados e lookbehind (com largura fixa), o Python suporta ambos, o PCRE suporta ambos, mas o POSIX ERE não segundo a spec POSIX. A ressalva: seu regex precisa rodar em um motor que tenha esses recursos.

O problema do "sabor" — seu regex funciona aqui, quebra ali

Sabores (flavors) de regex são dialetos do mesmo núcleo de linguagem, e eles divergem de maneiras que causam bugs silenciosos.

POSIX ERE é a base. Suporta os quantificadores +, *, ?, {m,n}, agrupamento e alternância. Ele não possui lookahead, lookbehind, backreferences ou grupos nomeados — essas são extensões do PCRE/Perl/Python/JavaScript. Se você está escrevendo um regex para uma ferramenta de sistema como grep ou sed, ou para uma biblioteca de validação simples, o POSIX é o que você vai ter.

O módulo re do Python casa Unicode por padrão. Como mencionado, \d é a classe decimal Unicode no Python 3. \w captura qualquer caractere de palavra Unicode, não apenas ASCII. Isso é ótimo para internacionalização, mas quebra expectativas se você está portando do mundo do PCRE, onde \d significa ASCII 0–9.

PCRE (e Perl) oferecem o máximo de recursos. Lookbehind, backreferences, grupos nomeados, grupos atômicos, quantificadores possessivos — se parece um superpoder de regex, o PCRE provavelmente tem. O custo é complexidade e portabilidade. Um padrão PCRE não funciona em JavaScript ou Python sem ajustes.

O JavaScript tem a maioria dos recursos modernos, mas exige lookbehind de largura fixa. Grupos nomeados, lookahead, lookbehind (mais ou menos) — todos suportados. O porém: uma asserção lookbehind como (?<=user_) deve ter um padrão de largura fixa, o que significa que você não pode usar + ou * dentro dela. (?<=[a-z]+) vai lançar um erro de sintaxe no JavaScript segundo a MDN. O PCRE permite lookbehind de largura variável, o que é mais poderoso, mas mais lento.

RE2 e o pacote regexp do Go priorizam velocidade no lugar de recursos. Eles garantem correspondência em tempo linear O(mn) (onde m é o tamanho do padrão e n é a entrada), tornando-se imunes ao backtracking catastrófico. A troca: nada de lookbehind, backreferences ou quantificadores possessivos. Se você liga mais para segurança e velocidade do que para recursos, RE2 é a escolha certa. O Google o construiu para lidar com padrões fornecidos pelo usuário com segurança.

A armadilha do ReDoS — por que ^(a+)+$ pode travar seu servidor

Essa é a ameaça de regex mais subestimada. Um padrão pode ser sintaticamente válido e semanticamente inútil, mas ainda assim fazer o motor travar ou dar timeout ao tentar corresponder a certas entradas. Isso se chama backtracking catastrófico ou ReDoS (Regular expression Denial of Service), e acontece quando quantificadores aninhados forçam o motor a explorar um caminho exponencial.

O exemplo clássico é ^(a+)+$. Envolhe a string aaaaaaaaaaaaaaa! (quinze as seguidos de !). O motor tenta corresponder ao padrão. O + externo é guloso, então ele consome todos os quinze as. O + interno também é guloso, então ele quer mais. O motor volta atrás (backtrack), dando menos caracteres ao + interno e tenta de novo. Ele continua tentando diferentes divisões dos as entre os dois quantificadores. Para apenas 16 as seguidos de um erro, o motor explora 65.536 caminhos possíveis de backtracking — exponencial. Dobre o tamanho da entrada e o número de caminhos explode.

Se você usar um testador de regex para alimentar esse padrão com uma string de teste de mais de 20 as seguida por um caractere que não corresponde, você vai ver o travamento ou timeout em tempo real. A correção é evitar quantificadores aninhados. ^a+$ faz o mesmo trabalho sem a armadilha. Para padrões mais complexos, a verdadeira solução é usar um motor como o RE2, que rejeita o backtracking inteiramente e garante tempo linear.

O detalhe: quantificadores aninhados costumam ser acidentais. Um padrão como (col|column)umn? parece inocente, mas se o usuário fornece uma entrada que não casa, o motor pode travar tentando diferentes maneiras de dividir a entrada entre as duas alternativas semelhantes a quantificadores. É por isso que aceitar padrões de regex fornecidos pelo usuário é perigoso. Sempre valide com RE2 ou restrinja o padrão a uma lista de permissões.

Para padrões que você mesmo escreve e testa, o risco é menor, mas ainda existe se você aceita padrões externos (um arquivo de configuração, um parâmetro de API, entrada do usuário). Teste-os em um testador de regex com casos extremos primeiro.

A armadilha clássica — validar e-mail é mais difícil do que parece

Validar e-mails parece simples: ^[a-zA-Z0-9.+]+@[a-zA-Z0-9]+\.[a-z]{2,}$. Mas não é. A RFC 5322 (a spec de e-mails) permite =, _ e outros caracteres na parte local que a maioria dos regexes não aceita. Mais sutilmente, um quantificador guloso como .+ vai capturar além da conta. Em user.email@example.com, o padrão ^[a-zA-Z0-9.+]+@ consumirá todos os caracteres até o último @ se houver vários, o que é errado. O regex "correto" que lida com todos os casos da RFC 5322 é tão longo e feio que os especialistas argumentam que não vale a pena escrevê-lo.

A solução prática: não valide e-mail com regex. Aceite a entrada, envie um e-mail de confirmação para o endereço e confirme se o usuário o recebeu. Essa é a única validação real. Se você quer apenas uma checagem rápida para pegar erros óbvios — sem @, sem domínio —, use algo permissivo como ^[^\s@]+@[^\s@]+$ (qualquer coisa, exceto espaço em branco ou @, em ambos os lados) e deixe que a etapa de confirmação cuide do resto. Teste alguns e-mails reais (incluindo first.last+tag@example.co.uk) em um testador de regex antes de decidir se o padrão está bom.

Como os motores de regex diferem na prática — uma matriz rápida

Motor / SaborLookbehindGrupos nomeadosBackreferencesUnicode \p{}Tempo linear (Seguro contra ReDoS)
POSIX ERE✓ (simples)
Python 3 re✓ (largura fixa)✓ ((?P<name>))Parcial (\w/\d entendem Unicode; \p{} apenas no módulo regex)
PCRE✓ (?<name>)
JavaScript✓ (apenas largura fixa)✓ (?<name>)✓ (com a flag u)
RE2 / GoLimitado✓ (garantido O(mn))

A grande lição: mais recursos não significam mais segurança ou velocidade. O RE2 é intencionalmente limitado para evitar ReDoS e garantir tempo linear. Python e JavaScript oferecem flexibilidade para padrões complexos. POSIX é o mínimo denominador comum. Escolha o motor que se adapta às suas restrições — se velocidade e segurança importam mais que recursos, escolha RE2 ou o regexp do Go. Se você precisa dos recursos, aceite o risco de backtracking e valide os padrões num testador antes.

Padrões comuns — e por que cada um é imperfeito

Uma cola rápida de padrões que você vai buscar, com a sincera ressalva de que cada um é imperfeito e assume seu caso de uso específico.

Número de telefone (padrão EUA): ^\d{3}-\d{3}-\d{4}$ captura 555-123-4567. Mas não lida com ramais, códigos de país ou espaços. E lembre-se: \d é Unicode no Python, ASCII no PCRE. Melhor fazer o parse e validar separadamente.

Data ISO (AAAA-MM-DD): ^\d{4}-\d{2}-\d{2}$ captura o formato, mas não checa se a data é válida (existe 30 de fevereiro?). Valide o formato com o regex e, em seguida, faça o parse e valide a lógica no código.

URL (simplificada): ^https?://[^\s]+$ permite qualquer caractere após o domínio, exceto espaço em branco. URLs reais são mais bagunçadas (parâmetros de busca, fragmentos, codificações). Use uma biblioteca de parsing de URL se precisar de precisão.

Linha CSV: ^[^,]*,[^,]*,[^,]*$ captura três campos separados por vírgula, sem tratamento especial para aspas ou vírgulas escapadas. Um regex nunca vai tratar CSV corretamente; use um parser de CSV.

Cada padrão acima funciona para seu caso restrito, mas quebra em variações. Sempre passe strings reais de teste (casos extremos, caracteres internacionais, formatações estranhas) por um testador de regex antes de dar o commit.

Ferramentas companheiras depois de pronto o padrão. Depois de criar um padrão regex, você frequentemente precisa manipular as strings correspondidas. Um conversor de caixa de texto transforma a saída correspondida para a caixa que você precisa. Para debugar ou logar resultados do regex, um formatador JSON embeleza os objetos de correspondência para que você veja os grupos de captura claramente. E se o seu regex serve para validar componentes de URL, um codificador de URL testa se seu padrão se dá bem com caracteres seguros para URL.

Então, qual motor você deveria escolher?

Três regras rápidas cobrem a maioria dos casos. Capturando padrões de usuários não confiáveis (uma caixa de busca, um campo de API, um arquivo de config editado por outra pessoa)? Use RE2 ou o regexp do Go — a garantia de tempo linear compensa a perda do lookbehind. Escrevendo um padrão para o seu próprio código em Python, JavaScript ou ferramenta PCRE? Use o motor que sua linguagem já possui; apenas lembre-se das diferenças de atalho de dígitos e lookbehind ao copiar um padrão entre eles. Fazendo um teste isolado numa ferramenta de shell tipo grep ou sed? Você está no POSIX, então esqueça o lookaround e backreferences completamente.

Não importa o que escolha, construa o padrão incrementalmente e veja-o rodar antes que ele toque em produção.

A conclusão final

Resumo: Construa padrões passo a passo no testador de regex da anytools, teste-os no motor que você realmente vai usar e aprenda as armadilhas daquele sabor. Evite quantificadores aninhados, prefira negação ([^<]) a quantificadores preguiçosos e nunca valide e-mail com um único regex — aceite a entrada, confirme-a separadamente e deixe o código checar a lógica. Para padrões não confiáveis, busque o RE2; para os seus próprios, cole-os no testador com alguns casos extremos feios antes de commitar.

Continue lendo


“Falar é fácil. Mostre-me o código.”
― Linus Torvalds

design

Guia da Sintaxe do Cron (2026): Como Ler e Criar Qualquer Expressão Crontab

Sintaxe do cron explicada: a ordem dos 5 campos, um modelo para ler em 10 segundos, 16 receitas testadas, a pegadinha do OR no dia da semana, armadilhas de horário de verão e cron vs systemd timers.

10 min read

Notebook com código e planta em cafeteria

design

JSON vs YAML vs TOML: Quando Escolher Cada Um (Guia para Desenvolvedores)

JSON vs YAML vs TOML, sem mistério: JSON para APIs e dados, YAML para config de Kubernetes/CI (cuidado com o problema da Noruega), TOML para configurações explícitas como Cargo.toml. Um guia de decisão prático.

9 min read

Tudo começou com apenas HTML, CSS e um pouco de JavaScript.

design

Base64 Explicado: Quando e Por Que Desenvolvedores Usam (e as Armadilhas)

O que o Base64 faz (3 bytes viram 4 caracteres ASCII, +33% de tamanho), os casos de uso reais (data URIs, JWT, autenticação Basic auth) e as armadilhas: ele não é criptografia e nem compressão.

8 min read

Um código QR estilizado e escaneável em um fundo verde, ilustrando o design de um QR code personalizado com a marca

design

QR Codes com a Sua Marca: Como Adicionar Logo e Cores com um Gerador Gratuito

Como a correção de erros permite sobrepor um logo a um QR code, as regras de contraste e zona de silêncio para manter a leitura, e a pegadinha do estático versus dinâmico.

8 min read

Cartelas de amostras de cores com valores CMYK e RGB hex sendo usadas por um designer gráfico em sua mesa de trabalho

design

HEX para RGB e CMYK em 2026: Por que a cor de impressão nunca fica igual à da tela

Converter HEX para RGB é uma matemática exata. Já RGB para CMYK é um palpite imperfeito que depende da impressora, do papel e de um perfil ICC. Entenda a diferença, veja a matemática por trás disso e saiba onde um conversor online realmente ajuda.

8 min read

Primeiro plano da folha de adesivos do Google Material design em um MacBook.

design

Ferramentas de Paleta de Cores para Acessibilidade: Por Que a Maioria das Paletas Falha Antes de Você Publicar

83,6% das homepages falham em contraste. Como escolher ferramentas que verificam paletas acessíveis, evitam erros comuns e testam as combinações corretas.

9 min read