Como verificar se cadeias de caracteres estão em um formato de email válido
O exemplo neste artigo usa uma expressão regular para verificar se uma cadeia de caracteres está em um formato de email válido.
Essa expressão regular é relativamente simples em comparação com o que pode ser usado como um email. Usar uma expressão regular para validar um email é útil para garantir que a estrutura dele está correta. No entanto, essa substituição não verifica se o email realmente existe.
✔️ USE uma expressão regular pequena para verificar a estrutura válida de um email.
✔️ ENVIE um email de teste para o endereço fornecido por um usuário do seu aplicativo.
❌ NÃO use uma expressão regular como a única maneira de validar um email.
Se você tentar criar a expressão regular perfeita para validar se a estrutura de um email está correta, a expressão se tornará tão complexa que será incrivelmente difícil depurar ou melhorar. Expressões regulares não podem validar se existe um email, mesmo que ele esteja estruturado corretamente. A melhor maneira de validar um email é enviar um email de teste para o endereço.
Aviso
Ao usar System.Text.RegularExpressions para processar entradas não confiáveis, passe um tempo limite. Um usuário mal-intencionado pode fornecer entrada para RegularExpressions
, causando um ataque de negação de serviço. APIs ASP.NET Core Framework que usam RegularExpressions
passam um tempo limite.
Exemplo
O exemplo define um método IsValidEmail
, que retornará true
se a cadeia de caracteres contiver um endereço de email válido e false
se não contiver, mas não realiza outra ação.
Para verificar se o endereço de email é válido, o método IsValidEmail
chama o método Regex.Replace(String, String, MatchEvaluator) com o padrão da expressão regular (@)(.+)$
para separar o nome de domínio do endereço de email. O terceiro parâmetro é um representante MatchEvaluator, que representa o método que processa e substitui o texto correspondente. O padrão da expressão regular é interpretado da seguinte maneira:
Padrão | Descrição |
---|---|
(@) |
Coincida o caractere @. Essa parte é o primeiro grupo de captura. |
(.+) |
Coincida uma ou mais ocorrências de qualquer caractere. Essa parte é o segundo grupo de captura. |
$ |
Encerrar a correspondência ao final da cadeia de caracteres. |
O nome de domínio, juntamente com o caractere @, é passado para o método DomainMapper
. O método usa a classe IdnMapping para traduzir caracteres Unicode que estão fora do intervalo de caracteres US-ASCII para Punycode. O método também define o sinalizador invalid
como True
, caso o método IdnMapping.GetAscii detecte algum caractere inválido no nome do domínio. O método retorna o nome de domínio Punycode precedido pelo símbolo @ para o método IsValidEmail
.
Dica
É recomendável que você use o padrão de expressão regular simples (@)(.+)$
para normalizar o domínio e retornar um valor que indica que ele passou ou falhou. No entanto, o exemplo neste artigo descreve como usar ainda mais uma expressão regular para validar o email. Independentemente de como você valida um email, você sempre deve enviar um email de teste para o endereço a fim de verificar se ele existe.
Em seguida, o método IsValidEmail
chama o método Regex.IsMatch(String, String) para verificar se o endereço está adequado para um padrão de expressão regular.
O método IsValidEmail
apenas determina se o formato de email é válido para um endereço de email; ele não valida se o email existe. Além disso, o método IsValidEmail
não verifica se o nome de domínio primário é um nome de domínio válido listado no IANA Root Zone Database (Banco de dados de zona raiz da IANA), o que exigiria uma operação de pesquisa.
using System;
using System.Globalization;
using System.Text.RegularExpressions;
namespace RegexExamples
{
class RegexUtilities
{
public static bool IsValidEmail(string email)
{
if (string.IsNullOrWhiteSpace(email))
return false;
try
{
// Normalize the domain
email = Regex.Replace(email, @"(@)(.+)$", DomainMapper,
RegexOptions.None, TimeSpan.FromMilliseconds(200));
// Examines the domain part of the email and normalizes it.
string DomainMapper(Match match)
{
// Use IdnMapping class to convert Unicode domain names.
var idn = new IdnMapping();
// Pull out and process domain name (throws ArgumentException on invalid)
string domainName = idn.GetAscii(match.Groups[2].Value);
return match.Groups[1].Value + domainName;
}
}
catch (RegexMatchTimeoutException e)
{
return false;
}
catch (ArgumentException e)
{
return false;
}
try
{
return Regex.IsMatch(email,
@"^[^@\s]+@[^@\s]+\.[^@\s]+$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
}
catch (RegexMatchTimeoutException)
{
return false;
}
}
}
}
Imports System.Globalization
Imports System.Text.RegularExpressions
Public Class RegexUtilities
Public Shared Function IsValidEmail(email As String) As Boolean
If String.IsNullOrWhiteSpace(email) Then Return False
' Use IdnMapping class to convert Unicode domain names.
Try
'Examines the domain part of the email and normalizes it.
Dim DomainMapper =
Function(match As Match) As String
'Use IdnMapping class to convert Unicode domain names.
Dim idn = New IdnMapping
'Pull out and process domain name (throws ArgumentException on invalid)
Dim domainName As String = idn.GetAscii(match.Groups(2).Value)
Return match.Groups(1).Value & domainName
End Function
'Normalize the domain
email = Regex.Replace(email, "(@)(.+)$", DomainMapper,
RegexOptions.None, TimeSpan.FromMilliseconds(200))
Catch e As RegexMatchTimeoutException
Return False
Catch e As ArgumentException
Return False
End Try
Try
Return Regex.IsMatch(email,
"^[^@\s]+@[^@\s]+\.[^@\s]+$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250))
Catch e As RegexMatchTimeoutException
Return False
End Try
End Function
End Class
Neste exemplo, o padrão de expressão regular ^[^@\s]+@[^@\s]+\.[^@\s]+$
é interpretado conforme mostrado na tabela a seguir. A expressão regular é compilada com o sinalizador RegexOptions.IgnoreCase.
Padrão | Descrição |
---|---|
^ |
Comece a correspondência no início da cadeia de caracteres. |
[^@\s]+ |
Corresponda uma ou mais ocorrências de qualquer caractere que não seja o caractere @ ou o espaço em branco. |
@ |
Coincida o caractere @. |
[^@\s]+ |
Corresponda uma ou mais ocorrências de qualquer caractere que não seja o caractere @ ou o espaço em branco. |
\. |
Corresponda a um único caractere de ponto. |
[^@\s]+ |
Corresponda uma ou mais ocorrências de qualquer caractere que não seja o caractere @ ou o espaço em branco. |
$ |
Encerrar a correspondência ao final da cadeia de caracteres. |
Importante
Essa expressão regular não se destina a abranger todos os aspectos de um endereço de email válido. Ela é fornecida como um exemplo para você estender conforme necessário.