Sdílet prostřednictvím


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

Viz také