Como verificar se as cadeias de caracteres estão no formato de e-mail válido
O exemplo neste artigo usa uma expressão regular para verificar se uma cadeia de caracteres está no formato de email válido.
Esta expressão regular é comparativamente simples ao que realmente pode ser usado como um e-mail. Usar uma expressão regular para validar um e-mail é útil para garantir que a estrutura de um e-mail esteja correta. No entanto, não é um substituto para verificar se o e-mail realmente existe.
✔️ USE uma pequena expressão regular para verificar a estrutura válida de um e-mail.
✔️ ENVIE um e-mail 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 e-mail.
Se você tentar criar a expressão regular perfeita para validar que a estrutura de um e-mail está correta, a expressão se torna tão complexa que é incrivelmente difícil depurar ou melhorar. Expressões regulares não podem validar a existência de um e-mail, mesmo que ele esteja estruturado corretamente. A melhor maneira de validar um e-mail é enviar um e-mail 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
o , causando um ataque de Negação de Serviço. ASP.NET APIs da estrutura principal que usam RegularExpressions
passar um tempo limite.
Exemplo
O exemplo define um IsValidEmail
método, que retorna true
se a cadeia de caracteres contiver um endereço de e-mail válido e false
se não contiver, mas não executar nenhuma outra ação.
Para verificar se o endereço de email é válido, o IsValidEmail
método chama o Regex.Replace(String, String, MatchEvaluator) método com o (@)(.+)$
padrão de expressão regular para separar o nome de domínio do endereço de email. O terceiro parâmetro é um MatchEvaluator delegado que representa o método que processa e substitui o texto correspondente. O padrão de expressão regular é interpretado da seguinte forma:
Padrão | Description |
---|---|
(@) |
Corresponda ao caractere @. Esta parte é o primeiro grupo de captura. |
(.+) |
Corresponder a uma ou mais ocorrências de qualquer personagem. Esta parte é o segundo grupo de captura. |
$ |
Termine a partida no final da string. |
O nome de domínio, juntamente com o caractere @, é passado para o DomainMapper
método. O método usa a IdnMapping classe para traduzir caracteres Unicode que estão fora do intervalo de caracteres US-ASCII para Punycode. O método também define o invalid
sinalizador para True
se o método deteta IdnMapping.GetAscii caracteres inválidos no nome de domínio. O método retorna o nome de domínio Punycode precedido pelo símbolo @ para o IsValidEmail
método.
Gorjeta
É recomendável usar o padrão de expressão regular simples (@)(.+)$
para normalizar o domínio e, em seguida, retornar um valor indicando que ele passou ou falhou. No entanto, o exemplo neste artigo descreve como usar uma expressão regular ainda mais para validar o email. Independentemente de como você valida um e-mail, você deve sempre enviar um e-mail de teste para o endereço para garantir que ele existe.
Em IsValidEmail
seguida, o método chama o Regex.IsMatch(String, String) método para verificar se o endereço está em conformidade com um padrão de expressão regular.
O IsValidEmail
método apenas determina se o formato de e-mail é válido para um endereço de e-mail, não valida que o e-mail existe. Além disso, o IsValidEmail
método não verifica se o nome de domínio de nível superior é um nome de domínio válido listado no banco de dados de zona raiz 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 ^[^@\s]+@[^@\s]+\.[^@\s]+$
de expressão regular é interpretado como mostrado na tabela a seguir. A expressão regular é compilada usando o RegexOptions.IgnoreCase sinalizador.
Padrão | Description |
---|---|
^ |
Comece a partida no início da string. |
[^@\s]+ |
Corresponder a uma ou mais ocorrências de qualquer caractere diferente do caractere @ ou espaço em branco. |
@ |
Corresponda ao caractere @. |
[^@\s]+ |
Corresponder a uma ou mais ocorrências de qualquer caractere diferente do caractere @ ou espaço em branco. |
\. |
Corresponder a um único caractere de período. |
[^@\s]+ |
Corresponder a uma ou mais ocorrências de qualquer caractere diferente do caractere @ ou espaço em branco. |
$ |
Termine a partida no final da string. |
Importante
Esta expressão regular não se destina a cobrir todos os aspetos de um endereço de e-mail válido. Ele é fornecido como um exemplo para você estender conforme necessário.