🧰 ToolPicoTodas as ferramentas →
InícioBlog › 5 Erros Comuns em Regex

5 Erros Comuns em Regex (e Como Extrair Dados de um Texto)

A maioria dos problemas com expressões regulares não vem de sintaxe complicada — vem de pequenos hábitos que passam despercebidos até o padrão falhar em produção. Este guia mostra os erros mais frequentes, com exemplos ilustrativos, e como usar o separador «Extrair / Listar» para tirar dados reais de um bloco de texto.

Índice

Erro 1 — Quantificadores gananciosos apanham texto a mais

Resposta curta: por defeito, * e + tentam corresponder ao máximo de texto possível. Num exemplo ilustrativo, o padrão <.+> aplicado a <a>texto</a> pode corresponder à cadeia inteira «<a>texto</a>» em vez de parar na primeira tag.

A correção mais comum é usar a versão «preguiçosa», acrescentando um ponto de interrogação a seguir ao quantificador: <.+?> para no primeiro > que encontrar. Isto é especialmente relevante quando o texto de teste tem várias ocorrências do mesmo delimitador — um padrão ganancioso mal escrito pode «engolir» várias correspondências numa só.

No testador, cola um exemplo com vários delimitadores repetidos no campo «Texto de teste», ativa a flag «g», e compara visualmente a área destacada ao mudar entre + e +? — a diferença fica imediatamente visível a cores.

Erro 2 — Esquecer a flag multilinha ao validar várias linhas

Resposta curta: sem a flag «m», as âncoras ^ e $ correspondem apenas ao início e fim de todo o texto, não de cada linha individual.

Isto costuma surpreender quem testa um padrão numa única linha (onde funciona perfeitamente) e depois o aplica a um ficheiro com várias linhas — de repente, quase nada corresponde. Num exemplo ilustrativo com uma lista de códigos, um por linha, o padrão ^\d{5}$ só encontra o primeiro código sem a flag «m»; com ela ativada, cada linha é avaliada de forma independente.

Regra prática: se o teu texto de teste tem mais do que uma linha e queres validar linha a linha, ativa sempre «m». Se, pelo contrário, queres garantir que o texto inteiro (sem quebras de linha extra) corresponde exatamente ao padrão, deixa «m» desativada.

Erro 3 — Carateres especiais sem escape (o ponto é o mais comum)

Resposta curta: o ponto . sem escape corresponde a «qualquer carácter», não apenas a um ponto literal. Escreve \. sempre que quiseres um ponto real, por exemplo em domínios ou números de versão.
Outros carateres a ter atenção: ( ) [ ] { } + * ? | ^ $ \ têm significado especial em regex — se quiseres usá-los literalmente (por exemplo, um parêntesis real num texto), tens de os escapar com uma barra invertida antes.

A forma mais fiável de apanhar este erro é testar sempre com um exemplo que não deveria corresponder — no separador «Testes» da ferramenta, junta um exemplo propositadamente errado ao campo «NÃO deve corresponder» e confirma que fica marcado a vermelho como esperado. Se corresponder por engano, é sinal de que falta um escape algures no padrão.

Como extrair emails, telefones ou datas de um bloco de texto

Resposta curta: escreve o padrão do que procuras, ativa a flag «g», cola o texto completo, e usa o separador «Extrair / Listar» para obter só as correspondências — uma por linha, separadas por vírgula, ou num formato personalizado.

Este fluxo é útil, por exemplo, quando um utilizador cola um bloco de notas ou um relatório copiado de outro sistema e precisa de isolar rapidamente todos os endereços de email ou todas as datas mencionadas, sem processar o ficheiro manualmente linha a linha.

  • Escolher o que extrair — a correspondência completa, ou apenas um grupo de captura específico (por exemplo, só o domínio de cada email).
  • Escolher o separador — linha a linha, vírgula, ponto e vírgula, ou um separador personalizado à tua escolha.
  • Remover duplicados — útil quando o mesmo valor aparece várias vezes no texto original.
  • Transferir — copia a lista com um clique, ou transfere-a como .txt ou como .csv com posição e grupos incluídos.
Exemplo ilustrativo — extração de datas de um texto com padrão \d{4}-\d{2}-\d{2}
Texto de origem (excerto)Resultado extraído
"reunião marcada para 2026-08-03, revisão a 2026-08-10"2026-08-03
2026-08-10

Dica: não uses as âncoras ^ e $ neste tipo de extração — elas fazem o padrão corresponder ao início/fim da linha ou do texto completo, o que impede encontrar ocorrências no meio de uma frase.

Testa o teu padrão regex em direto e extrai correspondências, grupos ou listas completas em segundos.

Abrir Testador de Regex →

Perguntas frequentes

Porque é que o meu regex apanha texto a mais (correspondência gananciosa)?
Por defeito, quantificadores como * e + são «gananciosos» — tentam corresponder ao máximo de texto possível antes de recuar. Um padrão como <\w+> aplicado a «<a><b>» pode corresponder ao bloco inteiro «<a><b>» em vez de só «<a>», porque o motor tenta esticar a correspondência o mais possível. A correção mais comum é usar a versão «preguiçosa» com um ponto de interrogação a seguir: <\w+?> corresponde ao mínimo necessário. No testador ToolPico, ativa a flag «g» e compara os dois padrões lado a lado no destaque em direto para ver a diferença.
Porque é que ^ e $ não estão a funcionar como eu esperava?
Sem a flag «m» (multilinha), ^ e $ correspondem apenas ao início e ao fim de todo o texto — não ao início e fim de cada linha. Se o teu texto de teste tiver várias linhas e quiseres validar cada linha individualmente, ativa a flag «m»; caso contrário, um padrão como ^\d+$ só vai corresponder se o texto inteiro for composto por dígitos, ignorando quebras de linha no meio. Este é um dos erros mais frequentes ao migrar um padrão testado numa única linha para um bloco de texto maior.
Porque é que um ponto (.) está a corresponder a mais do que eu queria?
O ponto sem escape corresponde a «qualquer carácter» — incluindo pontos literais. Um padrão como exemplo.com sem escapar o ponto também corresponde a «exemploXcom», o que raramente é a intenção. A correção é escapar o ponto com uma barra invertida: exemplo\.com. Isto é especialmente importante em domínios, números de versão (1.2.3) ou códigos postais com pontuação — testa sempre com um exemplo que NÃO deveria corresponder para confirmar que o escape está correto.
Como extraio todas as datas ou códigos de um relatório de texto extenso?
Escreve um padrão que capture o formato pretendido (por exemplo, \d{4}-\d{2}-\d{2} para datas ISO), ativa a flag «g» para encontrar todas as ocorrências, e cola o texto completo no campo «Texto de teste». No separador «Extrair / Listar», escolhe se queres a correspondência completa ou apenas um grupo de captura específico, escolhe o separador (linha a linha, vírgula, ou personalizado), ativa «remover duplicados» se o relatório tiver repetições, e copia ou transfere o resultado em .txt ou .csv.
Um padrão que funciona em JavaScript vai funcionar sempre igual em Python ou PHP?
Não necessariamente. A sintaxe base (classes de caracteres, quantificadores, grupos) é quase idêntica entre os motores ECMAScript (JavaScript), PCRE (PHP) e o módulo re do Python, mas funcionalidades avançadas como lookbehind de comprimento variável, grupos atómicos ou quantificadores possessivos podem comportar-se de forma diferente ou nem sequer existir em todos os motores. Antes de colar um padrão testado no navegador diretamente no teu código de produção, usa o separador «Gerar código» para veres a versão equivalente na tua linguagem de destino.
Nota: este artigo tem carácter informativo e educativo. Os exemplos de texto e resultados apresentados são ilustrativos — testa sempre o teu próprio padrão com dados reais antes de o usares em produção.