it-swarm.com.de

Ruby Email Validierung mit Regex

Ich habe eine große Liste von E-Mails, die ich durchläuft. Viele E-Mails haben Tippfehler. Ich versuche, eine Zeichenfolge zu erstellen, die gültige E-Mails überprüft. 

das ist, was ich für Regex habe.

def is_a_valid_email?(email)
  (email =~ /^(([A-Za-z0-9]*\.+*_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\+)|([A-Za-z0-9]+\+))*[A-Z‌​a-z0-9][email protected]{1}((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,4}$/i)
end

Es gilt, wenn eine E-Mail als Unterstrich und nur eine Periode gilt. Ich habe viele E-Mails, die mehr als eine Periode im Namen enthalten. Wie überprüfe ich das in Regex? 

[email protected] # <~~ valid
foo.bar#gmail.co.uk # <~~~ not valid
[email protected] # <~~~valid 
[email protected] # <~~ not valid 
[email protected]  #<~~ valid

Kann mir jemand helfen, meine Regex neu zu schreiben? 

41
T0ny lombardi

TL; DR:

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

Ursprüngliche Antwort

Sie scheinen die Dinge sehr zu komplizieren, ich würde einfach Folgendes verwenden:

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

welches aus Michael Hartls Rails Buch entnommen wird

da dies nicht Ihren Punkteanforderungen entspricht, kann es einfach wie folgt geändert werden:

VALID_EMAIL_REGEX = /\A([\w+\-]\.?)[email protected][a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i

Wie von CAustin erwähnt, gibt es viele andere Lösungen.

BEARBEITEN:

@installero wies darauf hin, dass das Original für Subdomains mit Bindestrich fehlschlägt. Diese Version funktioniert (nicht sicher, warum der Zeichenklasse überhaupt Ziffern und Bindestriche fehlten).

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
78
Mike H-R

Diese ist seit mindestens 2.2.1 in die Standardbibliothek eingebaut

URI::MailTo::EMAIL_REGEXP
25
Joshua Hunter

Hier ist ein großartiger Artikel von David Celis , in dem erklärt wird, warum jeder einzelne reguläre Ausdruck, den Sie zum Überprüfen von E-Mail-Adressen finden können, falsch ist, einschließlich der oben von Mike veröffentlichten.

Aus dem Artikel:

Die lokale Zeichenfolge (der Teil der E-Mail-Adresse, der vor dem @ Steht) kann die folgenden Zeichen enthalten:

    `! $ & * - = ` ^ | ~ # % ' + / ? _ { }` 

Aber rate mal was? Sie können .__ verwenden. so ziemlich jeder Charakter, den Sie wollen, wenn Sie ihn umgehen, indem Sie ihn umgeben. in Anführungszeichen. Zum Beispiel "Betrachten Sie alle diese Leerzeichen!" @ Example.com ist eine gültige Email Addresse. Nett.

Wenn Sie eine grundlegende Prüfung durchführen müssen, ist der beste reguläre Ausdruck einfach /@/.

24
John Carney

Dieser ist kurz und sicher:

/\A[^@\s][email protected][^@\s]+\z/

Das reguläre Element wird in Devise gem ..__ verwendet, weist jedoch einige Schwachstellen für diese Werte auf:

  "[email protected]",
  "[email protected]+THING-ODD!!.com",
  "[email protected],com",
  "[email protected],co.de"

Ich ziehe es vor, regexp aus der Ruby-Bibliothek zu verwenden. URI::MailTo::EMAIL_REGEXP

Es gibt ein Juwel für E-Mail-Überprüfungen

Email Validator

17
ilgam

Heutzutage bietet Ruby in seiner Standardbibliothek eine E-Mail-Bestätigung an. Sie finden es im URI::MailTo-Modul, es ist URI::MailTo::EMAIL_REGEXP. In Ruby 2.4.1 wird es ausgewertet

/\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/

Aber ich würde einfach die Konstante selbst verwenden.

10
kaikuchn

Ich denke, das Beispiel aus dem Buch kann verbessert werden, um E-Mails mit - in der Subdomain abzugleichen.

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

Zum Beispiel:

> '[email protected]' =~ VALID_EMAIL_REGEX
=> 0
3
installero

Dein ist in der Tat kompliziert.

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i

Der obige Code sollte ausreichen.

Erläuterung jedes Teils des obigen Ausdrucks zur Verdeutlichung:

Beginn der Regex:

/

Finde den Anfang einer Zeichenkette:

\A

Mindestens ein Word-Zeichen, ein Pluszeichen, ein Bindestrich oder ein Punkt:

[\w+\-.]+

Ein wörtliches "at sign":

@

Ein wörtlicher Punkt:

\.

Mindestens ein Buchstabe:

[a-z]+

Finde das Ende einer Zeichenkette:

\z

Ende der Regex:

/

Groß- und Kleinschreibung:

i

Wieder zusammensetzen:

/\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i

Check out Rubular , um Ihre Ausdrücke bequem zu testen, während Sie sie schreiben.

1
bdbasinger

versuche dies!!!

/\[A-Z0-9._%+-\][email protected]\[A-Z0-9.-\]+\.\[AZ\]{2,4}/i

nur E-Mail-Zeichenfolge ausgewählt

"Robert Donhan" <[email protected]>sadfadf
Robert Donhan <[email protected]>
"Robert Donhan" [email protected]
Robert Donhan [email protected]
0
Kiry Meas