Sprawdzanie, czy format poczty e-mail ciągów jest prawidłowy
W przykładzie w tym artykule użyto wyrażenia regularnego, aby sprawdzić, czy ciąg jest w prawidłowym formacie poczty e-mail.
To wyrażenie regularne jest stosunkowo proste do tego, co można faktycznie użyć jako wiadomości e-mail. Używanie wyrażenia regularnego do sprawdzania poprawności wiadomości e-mail jest przydatne, aby upewnić się, że struktura wiadomości e-mail jest poprawna. Nie jest to jednak podstawianie do sprawdzania, czy wiadomość e-mail rzeczywiście istnieje.
✔️ DO użyj małego wyrażenia regularnego, aby sprawdzić prawidłową strukturę wiadomości e-mail.
✔️ CZY wysłać testową wiadomość e-mail na adres dostarczony przez użytkownika aplikacji.
❌ Nie używaj wyrażenia regularnego jako jedynego sposobu weryfikacji wiadomości e-mail.
Jeśli spróbujesz utworzyć idealne wyrażenie regularne, aby sprawdzić, czy struktura wiadomości e-mail jest poprawna, wyrażenie staje się tak złożone, że jest niezwykle trudne do debugowania lub ulepszania. Wyrażenia regularne nie mogą zweryfikować, czy wiadomość e-mail istnieje, nawet jeśli jest ona poprawnie ustrukturyzowana. Najlepszym sposobem weryfikacji wiadomości e-mail jest wysłanie testowej wiadomości e-mail na adres.
Ostrzeżenie
W przypadku używania System.Text.RegularExpressions metody do przetwarzania niezaufanych danych wejściowych należy przekazać limit czasu. Złośliwy użytkownik może przekazać dane wejściowe , RegularExpressions
powodując atak typu "odmowa usługi". ASP.NET podstawowe interfejsy API platformy, które używają RegularExpressions
przekroczenia limitu czasu.
Przykład
W przykładzie zdefiniowano metodę IsValidEmail
, która zwraca true
wartość , jeśli ciąg zawiera prawidłowy adres e-mail, a false
jeśli nie, ale nie podejmuje żadnej innej akcji.
Aby sprawdzić, czy adres e-mail jest prawidłowy, IsValidEmail
metoda wywołuje Regex.Replace(String, String, MatchEvaluator) metodę ze (@)(.+)$
wzorcem wyrażenia regularnego, aby oddzielić nazwę domeny od adresu e-mail. Trzeci parametr to delegat reprezentujący metodę MatchEvaluator przetwarzającą i zastępującą dopasowany tekst. Wzorzec wyrażenia regularnego jest interpretowany w następujący sposób:
Wzorzec | opis |
---|---|
(@) |
Dopasuj znak @ . Ta część jest pierwszą grupą przechwytywania. |
(.+) |
Dopasuj co najmniej jedno wystąpienie dowolnego znaku. Ta część jest drugą grupą przechwytywania. |
$ |
Zakończ dopasowanie na końcu ciągu. |
Nazwa domeny wraz z znakiem @ jest przekazywana DomainMapper
do metody . Metoda używa IdnMapping klasy do tłumaczenia znaków Unicode, które znajdują się poza zakresem znaków US-ASCII do punycode. Metoda ustawia również flagę invalid
na True
, jeśli IdnMapping.GetAscii metoda wykryje nieprawidłowe znaki w nazwie domeny. Metoda zwraca nazwę domeny Punycode poprzedzoną symbolem @ do IsValidEmail
metody .
Napiwek
Zaleca się użycie prostego (@)(.+)$
wzorca wyrażenia regularnego w celu normalizacji domeny, a następnie zwrócenie wartości wskazującej, że została przekazana lub nie powiodła się. Jednak w przykładzie w tym artykule opisano sposób dalszego używania wyrażenia regularnego do weryfikowania wiadomości e-mail. Niezależnie od tego, jak weryfikujesz wiadomość e-mail, zawsze należy wysłać testową wiadomość e-mail na adres, aby upewnić się, że istnieje.
Następnie IsValidEmail
metoda wywołuje metodę Regex.IsMatch(String, String) , aby sprawdzić, czy adres jest zgodny ze wzorcem wyrażenia regularnego.
Metoda IsValidEmail
określa jedynie, czy format wiadomości e-mail jest prawidłowy dla adresu e-mail; nie sprawdza, czy wiadomość e-mail istnieje. Ponadto metoda nie sprawdza, IsValidEmail
czy nazwa domeny najwyższego poziomu jest prawidłową nazwą domeny wymienioną w bazie danych strefy głównej IANA, co wymaga operacji wyszukiwania.
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
W tym przykładzie wzorzec ^[^@\s]+@[^@\s]+\.[^@\s]+$
wyrażenia regularnego jest interpretowany, jak pokazano w poniższej tabeli. Wyrażenie regularne jest kompilowane przy użyciu flagi RegexOptions.IgnoreCase .
Wzorzec | opis |
---|---|
^ |
Rozpocznij dopasowanie na początku ciągu. |
[^@\s]+ |
Dopasuj co najmniej jedno wystąpienie dowolnego znaku innego niż znak @ lub biały znak. |
@ |
Dopasuj znak @ . |
[^@\s]+ |
Dopasuj co najmniej jedno wystąpienie dowolnego znaku innego niż znak @ lub biały znak. |
\. |
Dopasuj pojedynczy znak kropki. |
[^@\s]+ |
Dopasuj co najmniej jedno wystąpienie dowolnego znaku innego niż znak @ lub biały znak. |
$ |
Zakończ dopasowanie na końcu ciągu. |
Ważne
To wyrażenie regularne nie ma na celu pokrycia każdego aspektu prawidłowego adresu e-mail. Jest on podany jako przykład rozszerzenia w razie potrzeby.