2008-12-15 10 views
10

Ich arbeite an einem kleinen Projekt in VB.Net, wo ich eine Eingabe aus einer Textbox erhalte und sicherstellen muss, dass dies eine E-Mail-Adresse ist.Validieren von E-Mail mit regulärem Ausdruck VB.Net

Ich fand diesen Ausdruck "^ [_ a-z0-9 -] + (. [_ A-z0-9 -] +) @ [a-z0-9 -] + (. [A-z0-9 -] +) (. [Az] {2,4}) $ ", aber ich kann keinen Weg finden zu testen, ob es passiert.

Ich möchte einige Code wie:

if not txtEmail.text = regexString then 
    something happens.. 
else 
    something else happens.. 
end if 
+1

Darf ich Sie auf die Tatsache, dass, wenn Sie Google nach " vb.net regex ", der _first_ link gibt Ihnen Schritt für Schritt Anweisungen dafür? – Svante

+2

Es ist eine nette Frage, die ich bei StackOverflow zu Protokoll nehmen kann - ich sehe nichts falsch daran, das hier zu fragen. – Jeffrey

Antwort

18

Verwenden Sie die System.Text.RegularExpressions.Regex Klasse:

Function IsEmail(Byval email as string) as boolean 
    Static emailExpression As New Regex("^[_a-z0-9-]+(.[a-z0-9-]+)@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$") 

    return emailExpression.IsMatch(email) 
End Function 

Das Wichtigste über diese Antwort zu verstehen ist, dass ich nicht den regulären Ausdruck selbst geschrieben hat. Es gibt einfach so viele falsche Wege, die richtig zu sein scheinen, und es gibt mehrere Ebenen von Details, denen Sie das anhängen könnten. Möchten Sie dies beispielsweise auf gültige Top-Level-Domains beschränken, und wenn ja, wie können Sie der Tatsache Rechnung tragen, dass sie gelegentlich neue TLDs hinzufügen? Ist der reguläre Ausdruck der am besten geeignete Ort für diesen Test oder sollte er separaten Code für diesen Test haben? Sogar der Ausdruck in dieser Antwort ist jetzt sehr alt, seit er ursprünglich geschrieben wurde. Ich empfehle, eine Ressource zu finden, die Sie für den Ausdruck verwenden können, von dem Sie wissen, dass er gepflegt wird.

+3

'Wenn ... Dann Return True Else Return False' ist sicherlich in der aller Zeiten Top Ten der Anti-Patterns. : -/ –

+0

Yeah: Es ist eine schlechte Angewohnheit, die ich bei meinem letzten Auftritt erworben habe, wo es die Politik verhinderte, die Ergebnisse boolescher Ausdrücke direkt zurück zu geben. Korrigieren Sie die Probe. –

+0

Ich fand, dass es "als neues System.Text.RegularExpressions.Regex" sein muss, wo es "als neues Regex" Thx für die Hilfe sagt :) – AndersE

5

Es gibt eine großartige Website für diese Art von Sache, http://regexlib.com/. Es gibt nicht nur eine Testanwendung, in der Sie einen regulären Ausdruck einfügen und testen können, sondern es gibt auch eine Bibliothek mit regulären Ausdrücken, die Sie mit Community-Feedback zu ihrer Gültigkeit usw. verwenden können. Ich bin also kein Regex-Guru Ich gehe hier hin, wenn ich einen schnellen, regelmäßigen Ausdruck brauche. Wenn Sie darüber nachdenken, selbst reguläre Ausdrücke zu entwickeln, gibt es ein hervorragendes Tool mit der Bezeichnung Regex Buddy, mit dem Sie Ihre regulären Ausdrücke im Handumdrehen erstellen und testen können, indem Sie eine leicht verständliche englische Interpretation Ihrer Regex verwenden.

+0

Ich hatte einen Fall, wo eine E-Mail die einfachere Regex über"^[_a-z0-9 -] + (. [a-z0-9 -] +) @ [a-z0-9 -] + (. [a-z0-9 -] +) * (. [az] { 2,4}) $ ". Als ich zurückkam, benutzte ich regexlib, das Anderson so freundlich war, die am höchsten bewerteten E-Mail-Regex zu teilen und zu durchsuchen. Es gab 4 Treffer und dieser war der Anfang der Liste und hat am besten für mich funktioniert: "^ (([! # $% & '* + \ -/=?^_' {|} ~ \ W]) | ([! # $% & '* + \ -/=?^_ '{|} ~ \ w] [! # $% &' * + \ -/=?^_' {|} ~ \. \ w ] {0,} [! # $% & '* + \ -/=?^_ '{|} ~ \ W])) [@] \ w + ([-.] \ W +) * \. \ W + ([-.] \ w +) *) $ "Quell- und Testseite hier: http://regexlib.com/RETester.aspx?regexp_id=2558 –

2

Diese Regex ist nicht wirklich vollständig ... in der Tat ... die meisten sind nicht (siehe this article oder this one).

Sofern Sie nicht wirklich Schmerzen haben, ist Regex nicht der richtige Weg, um eine E-Mail-Adresse zu validieren.

+1

Können Sie allen sagen, wie Sie eine E-Mail-Adresse in .net richtig validieren? ? –

-2

E-Mail-Adresse: RFC 2822 (vereinfacht) Entspricht einer normalen E-Mail-Adresse. Überprüft nicht die Top-Level-Domain. Erfordert die Option "Groß-/Kleinschreibung nicht beachten", um eingeschaltet zu sein.

Dim FoundMatch As Boolean 
Try 
    FoundMatch = Regex.IsMatch(txtEmail.text, "\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase) 
Catch ex As ArgumentException 
    'Syntax error in the regular expression 
End Try 

If Not FoundMatch Then 
    Error = True 
Else 
    Error = False 
End If 
+0

Der Ausdruck ist fehlerhaft (z. B. können keine Nur-TLD-Adressen zugelassen werden). Siehe http://stackoverflow.com/questions/369543/validating-e-mail-with-regular-expression-vbnet#369614 – bzlm

+0

Beispiel ist nicht kaputt. Es überprüft keine Top-Level-Domains. Wie ich in meinem Kommentar erwähnt habe. Siehe meinen anderen Kommentar für einen, der das tut. – Mick

+3

Ich werde nie verstehen, warum jemand eine IF-Anweisung wie Ihre letzte in diesem Ausschnitt schreiben würde. Das ist nur verrückt. Es sollte sein: Error = Not FoundMatch –

6

Wählen Sie Ihre Lieblings regex von my article on matching email addresses with a regex, und in diesem Visual Basic-Code-Stecker:

If Regex.IsMatch(SubjectString, "regex") Then 
    Error = False 
Else 
    Error = True 
End If 

Die beste regex eine E-Mail-Adresse entspricht ist ein umstrittenes Thema, das ich will nicht bekommen hier hinein. Mein Artikel beschreibt die Probleme, die Sie beachten sollten, wenn Sie eine Regex auswählen. Die Regex in Joel Coehoorns Antwort ist definitiv nicht gut.

+0

Nice Beschreibung der verschiedenen Kompromisse auf der verknüpften Webseite. – WileCau

5

Möglicherweise off-topic, da es keine regex Lösung, aber man konnte nur einige der Features von .NET 2.0 gebaut verwenden:

try 
{ 
    MailAddress email = new MailAddress(txtEmail.Text); 
} 
catch(FormatException fe) 
{ 
    // output error 
} 
+1

Dies ist überall in dem Projekt, an dem ich gerade arbeite, und ich ziehe es aus. Ich sehe nicht, dass das Auslösen einer Ausnahme eine gute Logik oder Validierungstechnik ist, abgesehen von allem, was eine teure Aufgabe ist. Fühlen Sie sich frei, mich zu korrigieren, obwohl –

+0

ich hatte eine harte Zeit bekommen, dass dies zu brechen, übergab ich es alle Arten von Müll-E-Mails und es verschlang sie ohne Ausnahme und ich entfernte dies aus meinem Code. –

Verwandte Themen