Regex para validar e-mails

Por André Ataíde em 27/12/2023

O HTML5 usa uma regex específica para validar e-mails nos campos <input type="email">. A regex é definida pela especificação HTML5 e segue o padrão definido na especificação RFC 5322, que descreve o formato de endereços de e-mail.

A regex usada pelo HTML5 para validar e-mails é a seguinte:

^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)*$

Esta regex verifica várias partes de um endereço de e-mail:

Esta regex é usada pelos navegadores modernos quando você usa em um formulário HTML5 para validar automaticamente o campo de entrada de e-mail. Ela ajuda a garantir que o formato do endereço de e-mail seja válido, mas não verifica a existência real do endereço de e-mail.

Você pode usar a mesma regex de e-mail que o HTML5 usa em JavaScript da seguinte maneira:

const regexEmailHTML5 = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)*$/;


const email = "exemplo@email.com";

if (regexEmailHTML5.test(email)) {

console.log("O e-mail é válido.");

} else {

console.log("O e-mail não é válido.");

}

Neste exemplo, a regexEmailHTML5 é a mesma regex que o HTML5 usa para validar endereços de e-mail em campos <input type="email">. Você pode usar a função test() do objeto regex para verificar se uma string corresponde a essa regex e, assim, validar o endereço de e-mail em JavaScript. O código acima imprimirá "O e-mail é válido." se o endereço de e-mail estiver no formato correto e "O e-mail não é válido." se não estiver.

No Python, podemos usar a função abaixo que sanitiza e valida e-mails usando como exemplo, uma versão simplificada da Regex usada no HTML5:

import re


def validar_e_sanitize_email(email):

    # Remover espaços em branco extras

    email_saneado = email.strip()


    # Utilizar a regex padrão de e-mails do HTML5.

    padrao_email_html5 = re.compile(

        r'^[a-zA-Z0-9.!#$%&\'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$'

    )


    if padrao_email_html5.match(email_saneado):

        # Tudo certo, retorna o e-mail saneado

        return email_saneado

    else:

        # Lida com o caso em que o e-mail não é válido

        return None

Obviamente, essas regex podem ser ajustadas para casos mais específicos como validar e-mails para um determinado domínio apenas...

Referências: HTML Living Standard