Så här kontrollerar du att strängarna är i giltigt e-postformat
Exemplet i den här artikeln använder ett reguljärt uttryck för att verifiera att en sträng är i giltigt e-postformat.
Det här reguljära uttrycket är jämförelsevis enkelt för vad som faktiskt kan användas som e-post. Att använda ett reguljärt uttryck för att verifiera ett e-postmeddelande är användbart för att säkerställa att strukturen för ett e-postmeddelande är korrekt. Det är dock inte en ersättning för att verifiera att e-postmeddelandet faktiskt finns.
✔️ Använd ett litet reguljärt uttryck för att söka efter den giltiga strukturen för ett e-postmeddelande.
✔️ Skicka ett testmeddelande till den adress som tillhandahålls av en användare av din app.
❌ Använd inte ett reguljärt uttryck som det enda sättet att verifiera ett e-postmeddelande.
Om du försöker skapa det perfekta reguljära uttrycket för att verifiera att strukturen för ett e-postmeddelande är korrekt blir uttrycket så komplext att det är otroligt svårt att felsöka eller förbättra. Reguljära uttryck kan inte verifiera att ett e-postmeddelande finns, även om det är korrekt strukturerat. Det bästa sättet att verifiera ett e-postmeddelande är att skicka ett testmeddelande till adressen.
Varning
När du använder System.Text.RegularExpressions för att bearbeta ej betrodda indata skickar du en timeout. En obehörig användare kan ange indata till RegularExpressions
, vilket orsakar en Denial-of-Service-attack. ASP.NET Core Framework-API:er som använder RegularExpressions
passera en timeout.
Exempel
Exemplet definierar en IsValidEmail
metod som returnerar true
om strängen innehåller en giltig e-postadress och false
om den inte gör det men inte vidtar någon annan åtgärd.
För att verifiera att e-postadressen är giltig IsValidEmail
anropar Regex.Replace(String, String, MatchEvaluator) metoden metoden med (@)(.+)$
reguljärt uttrycksmönster för att skilja domännamnet från e-postadressen. Den tredje parametern är ett MatchEvaluator ombud som representerar metoden som bearbetar och ersätter den matchade texten. Mönster för reguljära uttryck tolkas på följande sätt:
Mönster | beskrivning |
---|---|
(@) |
Matcha @-tecknet. Den här delen är den första insamlingsgruppen. |
(.+) |
Matcha en eller flera förekomster av ett tecken. Den här delen är den andra insamlingsgruppen. |
$ |
Avsluta matchningen i slutet av strängen. |
Domännamnet, tillsammans med @-tecknet, skickas till DomainMapper
metoden. Metoden använder IdnMapping klassen för att översätta Unicode-tecken som ligger utanför teckenintervallet US-ASCII till Punycode. Metoden anger invalid
också flaggan till True
om IdnMapping.GetAscii metoden identifierar ogiltiga tecken i domännamnet. Metoden returnerar punycode-domännamnet som föregås av @-symbolen IsValidEmail
till metoden.
Dricks
Vi rekommenderar att du använder det enkla (@)(.+)$
reguljära uttrycksmönstret för att normalisera domänen och sedan returnerar ett värde som anger att den har skickats eller misslyckats. Exemplet i den här artikeln beskriver dock hur du använder ett reguljärt uttryck ytterligare för att verifiera e-postmeddelandet. Oavsett hur du validerar ett e-postmeddelande bör du alltid skicka ett testmeddelande till adressen för att säkerställa att det finns.
Metoden IsValidEmail
anropar Regex.IsMatch(String, String) sedan metoden för att verifiera att adressen överensstämmer med ett mönster för reguljära uttryck.
Metoden avgör bara om e-postformatet är giltigt för en e-postadress. Det IsValidEmail
verifierar inte att e-postmeddelandet finns. IsValidEmail
Metoden verifierar inte heller att domännamnet på den översta nivån är ett giltigt domännamn som anges i IANA Root Zone Database, vilket skulle kräva en uppslagsåtgärd.
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
I det här exemplet tolkas mönster för ^[^@\s]+@[^@\s]+\.[^@\s]+$
reguljära uttryck enligt följande tabell. Det reguljära uttrycket kompileras med hjälp av RegexOptions.IgnoreCase flaggan.
Mönster | beskrivning |
---|---|
^ |
Börja matchningen i början av strängen. |
[^@\s]+ |
Matcha en eller flera förekomster av något annat tecken än @-tecknet eller blanksteget. |
@ |
Matcha @-tecknet. |
[^@\s]+ |
Matcha en eller flera förekomster av något annat tecken än @-tecknet eller blanksteget. |
\. |
Matcha ett tecken med en punkt. |
[^@\s]+ |
Matcha en eller flera förekomster av något annat tecken än @-tecknet eller blanksteget. |
$ |
Avsluta matchningen i slutet av strängen. |
Viktigt!
Det här reguljära uttrycket är inte avsett att täcka alla aspekter av en giltig e-postadress. Det tillhandahålls som ett exempel för att du ska kunna utöka efter behov.