Desenvolvimento

Regex para Validação de E-mail, URL e Número de Telefone

A regex de validação é copiada mais do que qualquer outro tipo, e boa parte dela tem erros sutis. Aqui estão padrões que funcionam em formulários reais, o que cada parte faz e os casos em que uma expressão regular é a ferramenta errada.

Intermediário · 8 min de leitura · Atualizado em 30 de outubro de 2026

Regex para Validação de E-mail, URL e Número de Telefone

Valide de forma flexível, verifique de verdade

Uma regex consegue dizer que uma entrada parece um endereço de e-mail; só enviar uma mensagem prova que ele existe. Padrões rígidos rejeitam usuários reais — sinais de mais, domínios longos, nomes internacionais — e ainda deixam passar erros de digitação. Busque padrões que peguem erros óbvios e depois verifique.

Endereços de e-mail

Um padrão pragmático que combina com quase todo endereço real:

^[^\s@]+@[^\s@]+\.[^\s@]{2,}$

Algo, um @, um domínio com ponto e nenhum espaço. Ele aceita ada+news@example.co.uk e rejeita ada@example e ada @example.com. Uma versão um pouco mais restrita para a parte local:

^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$

Essa rejeita endereços internacionalizados (como josé@example.com), então prefira a primeira se seus usuários forem de todo o mundo. No HTML, <input type="email"> já valida usando a regra do próprio navegador. Para checar se um domínio realmente recebe e-mails, consulte o registro MX com o Email DNS Checker.

URLs

Não escreva uma regex para URL — faça o parse. Todo runtime moderno tem um parser de URL que conhece as regras:

function isHttpUrl(value) {
  try {
    const u = new URL(value);
    return u.protocol === 'http:' || u.protocol === 'https:';
  } catch {
    return false;
  }
}

Verificar o protocolo é importante: new URL('javascript:alert(1)') é analisada sem erro, e essa string nunca pode acabar em um href. Se você precisar de uma regex para encontrar URLs em um texto, use algo simples e faça o parse de cada resultado depois:

https?:\/\/[^\s<>"']+

Separe uma URL em protocolo, host, caminho e parâmetros de consulta com o URL Parser.

Números de telefone

Os formatos de telefone variam por país, então a regex mais segura apenas limpa a entrada. Remova tudo exceto dígitos e um sinal de mais no início, depois verifique o tamanho segundo o E.164 (até 15 dígitos):

const clean = input.replace(/(?!^\+)[^\d]/g, '');
const ok = /^\+?[1-9]\d{6,14}$/.test(clean);

Para uma validação real por país — DDD, celular versus fixo — use uma biblioteca como o libphonenumber. Um padrão apenas para o formato norte-americano, se for só isso que você aceita:

^\(?([2-9]\d{2})\)?[-.\s]?(\d{3})[-.\s]?(\d{4})$

Teste antes de publicar

Cole um padrão no Regex Tester com uma lista de exemplos válidos e inválidos, um por linha, e ative a flag multiline para que ^ e $ façam correspondência em cada linha. Se um padrão herdado for ilegível, o Regex Explainer o divide token por token. Cuidado com o backtracking catastrófico: quantificadores aninhados como (a+)+ podem travar um servidor com uma entrada maliciosa.

Perguntas frequentes

Qual é a melhor regex para validar e-mail?
Uma simples: ^[^\s@]+@[^\s@]+\.[^\s@]{2,}$. Padrões complexos no estilo RFC rejeitam endereços válidos e mesmo assim não conseguem provar que a caixa de entrada existe — para isso, envie um e-mail de confirmação.
Devo validar URLs com regex?
Não. Use o parser de URL nativo da sua linguagem (new URL() em JavaScript, urllib.parse em Python) e confira se o protocolo é http ou https.
Por que minha regex funciona em uma linha, mas não em uma lista?
Sem a flag m (multiline), ^ e $ correspondem ao início e ao fim do texto inteiro, e não de cada linha.

Continue lendo