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.
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.