Ověření platnosti e-mailového formátu řetězců
Příklad v tomto článku používá regulární výraz k ověření, že řetězec je v platném e-mailovém formátu.
Tento regulární výraz je poměrně jednoduchý na to, co lze skutečně použít jako e-mail. Použití regulárního výrazu k ověření e-mailu je užitečné k zajištění správné struktury e-mailu. Nejedná se ale o náhradu za ověření, že e-mail skutečně existuje.
✔️ Použijte malý regulární výraz ke kontrole platné struktury e-mailu.
✔️ Odešlete testovací e-mail na adresu poskytnutou uživatelem vaší aplikace.
❌ Nepoužívejte regulární výraz jako jediný způsob, jak ověříte e-mail.
Pokud se pokusíte vytvořit dokonalý regulární výraz, abyste ověřili správnost struktury e-mailu, výraz se stane tak složitým, že je neuvěřitelně obtížné ladit nebo vylepšit. Regulární výrazy nemůžou ověřit, že e-mail existuje, i když je správně strukturovaný. Nejlepším způsobem, jak ověřit e-mail, je odeslat testovací e-mail na adresu.
Upozorňující
Při zpracování System.Text.RegularExpressions nedůvěryhodného vstupu předejte vypršení časového limitu. Uživatel se zlými úmysly může poskytnout vstup RegularExpressions
, což způsobí útok na dostupnost služby. ASP.NET rozhraní API architektury Core, která používají RegularExpressions
vypršení časového limitu.
Příklad
Příklad definuje metodu IsValidEmail
, která vrátí true
, pokud řetězec obsahuje platnou e-mailovou adresu a false
pokud ne, ale neprovádí žádnou jinou akci.
Pokud chcete ověřit platnost e-mailové adresy, IsValidEmail
metoda volá Regex.Replace(String, String, MatchEvaluator) metodu se vzorem (@)(.+)$
regulárního výrazu, aby oddělil název domény od e-mailové adresy. Třetí parametr je MatchEvaluator delegát, který představuje metodu, která zpracovává a nahrazuje odpovídající text. Vzor regulárního výrazu se interpretuje takto:
Vzor | Popis |
---|---|
(@) |
Porovná znak @. Tato část je první zachycenou skupinou. |
(.+) |
Porovná jeden nebo více výskytů libovolného znaku. Tato část je druhou zachycenou skupinou. |
$ |
Ukončete shodu na konci řetězce. |
Název domény spolu se znakem @ se předá DomainMapper
metodě. Metoda používá třídu k překladu IdnMapping znaků Unicode, které jsou mimo rozsah znaků US-ASCII na Punycode. Metoda také nastaví invalid
příznak, pokud True
IdnMapping.GetAscii metoda zjistí neplatné znaky v názvu domény. Metoda vrátí název domény punycode před znakem @ metodě IsValidEmail
.
Tip
Doporučujeme použít jednoduchý (@)(.+)$
vzor regulárního výrazu k normalizaci domény a vrátit hodnotu, která označuje, že se předala nebo selhala. Příklad v tomto článku ale popisuje, jak použít regulární výraz k dalšímu ověření e-mailu. Bez ohledu na to, jak e-mail ověříte, měli byste na adresu vždy poslat testovací e-mail, abyste měli jistotu, že existuje.
Metoda IsValidEmail
pak zavolá metodu Regex.IsMatch(String, String) k ověření, že adresa odpovídá vzoru regulárního výrazu.
Metoda IsValidEmail
pouze určuje, jestli je formát e-mailu platný pro e-mailovou adresu. Neověřuje, jestli e-mail existuje. Metoda také neověřuje, IsValidEmail
že název domény nejvyšší úrovně je platný název domény uvedený v databázi kořenové zóny IANA, což by vyžadovalo operaci vyhledávání.
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
V tomto příkladu je vzor ^[^@\s]+@[^@\s]+\.[^@\s]+$
regulárního výrazu interpretován, jak je znázorněno v následující tabulce. Regulární výraz je zkompilován pomocí příznaku RegexOptions.IgnoreCase .
Vzor | Popis |
---|---|
^ |
Zahajte shodu na začátku řetězce. |
[^@\s]+ |
Porovná jeden nebo více výskytů jakéhokoli jiného znaku než znak @ nebo prázdné znaky. |
@ |
Porovná znak @. |
[^@\s]+ |
Porovná jeden nebo více výskytů jakéhokoli jiného znaku než znak @ nebo prázdné znaky. |
\. |
Porovná jeden znak tečky. |
[^@\s]+ |
Porovná jeden nebo více výskytů jakéhokoli jiného znaku než znak @ nebo prázdné znaky. |
$ |
Ukončete shodu na konci řetězce. |
Důležité
Tento regulární výraz není určený k pokrytí všech aspektů platné e-mailové adresy. Poskytuje se jako příklad, který můžete podle potřeby rozšířit.