Was ist der eleganteste Code, um zu überprüfen, ob eine Zeichenkette eine gültige E-Mail-Adresse ist?
Antworten
Zu viele Anzeigen?Ich möchte nur darauf hinweisen, dass es kürzlich eine Ergänzung der .NET-Dokumentation zur E-Mail-Validierung gegeben hat, die auch Regex-Operationen verwendet. Eine ausführliche Erklärung zu deren Implementierung ist dort zu finden.
Der Einfachheit halber finden Sie hier eine Liste ihrer Testergebnisse:
// Valid: david.jones@proseware.com
// Valid: d.j@server1.proseware.com
// Valid: jones@ms1.proseware.com
// Invalid: j.@server1.proseware.com
// Valid: j@proseware.com9
// Valid: js#internal@proseware.com
// Valid: j_9@[129.126.118.1]
// Invalid: j..s@proseware.com
// Invalid: js*@proseware.com
// Invalid: js@proseware..com
// Valid: js@proseware.com9
// Valid: j.s@server1.proseware.com
// Valid: "j\"s\""@proseware.com
// Valid: js@contoso.
Ich finde, diese Regex ist ein guter Kompromiss zwischen der Überprüfung auf mehr als nur das @-Zeichen und der Akzeptanz von seltsamen Randfällen:
^[^@\s]+@[^@\s]+(\.[^@\s]+)+$
Es wird Sie zumindest dazu bringen, etwas um das @-Zeichen herum zu setzen und zumindest eine normal aussehende Domain anzugeben.
Ich fasse alle oben genannten Antworten ab dem laufenden Jahr 2021 zusammen, das ich für mich selbst in dieser Klasse geschrieben habe:
public static class StringExt {
private const string emailPattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"
+ @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)"
+ @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";
public static bool IsValidMailAddress(this string pThis)
=> pThis is not null
&& Regex.IsMatch(pThis, emailPattern, RegexOptions.IgnoreCase);
}
Hier ist meine Antwort: Phils Lösung versagt bei Domänen mit nur einem Buchstaben wie "someone@q.com". Ob Sie es glauben oder nicht, das wird verwendet =) (geht z.B. an centurylink).
Phil's Antwort wird auch nur mit PCRE-Standard funktionieren... so C# wird es nehmen, aber Javascript wird zu bombardieren. Es ist zu komplex für Javascript. So können Sie nicht verwenden Phil's Lösung für mvc Validierung Attribute.
Hier ist meine Regex. Es wird schön mit MVC Validierung Attribute arbeiten.
- Alles vor dem @ ist vereinfacht, so dass zumindest Javascript funktioniert. Ich habe kein Problem damit, die Validierung hier zu entspannen, solange der Exchange Server mir keine 5.1.3 gibt. - Alles nach dem @ ist Phils Lösung, modifiziert für Domains mit nur einem Buchstaben.
public const string EmailPattern =
@"^\s*[\w\-\+_']+(\.[\w\-\+_']+)*\@[A-Za-z0-9]([\w\.-]*[A-Za-z0-9])?\.[A-Za-z][A-Za-z\.]*[A-Za-z]$";
Für Leute, die vorschlagen, system.net.mail MailMessage() zu verwenden, ist das Ding VIEL zu flexibel. Sicher, C# wird die E-Mail akzeptieren, aber dann Exchange Server wird mit 5.1.3 Laufzeitfehler bombardieren, sobald Sie versuchen, die E-Mail zu senden.
Die Überprüfung von E-Mail-Adressen ist nicht so einfach, wie es scheinen mag. Es ist theoretisch unmöglich, eine E-Mail-Adresse nur mit einem regulären Ausdruck vollständig zu validieren.
Sehen Sie sich meine Blogbeitrag für eine Diskussion zu diesem Thema und eine F#-Implementierung mit FParsec. [/shameless_plug]