Validation Ruby Email avec regex

J’ai une grande liste de courriels que je traverse. Beaucoup d’emails ont des fautes de frappe. J’essaie de construire une chaîne qui vérifiera les emails valides.

c’est ce que j’ai pour les regex.

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]+@{1}((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,4}$/i) end 

Il passe si un email comme soulignement et seulement une période. J’ai beaucoup d’emails qui ont plus d’une période dans le nom lui-même. Comment puis-je vérifier cela dans regex.

 hello.me_1@email.com # <~~ valid foo.bar#gmail.co.uk # <~~~ not valid foobar@gmail.com # <~~~valid f...bar@gmail.com # <~~ not valid get_at_m.e@gmail #<~~ valid 

Est-ce que quelqu’un peut m’aider à réécrire ma regex?

TL; DR:

 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[az\d\-]+(\.[az\d\-]+)*\.[az]+\z/i 

Réponse originale

Vous semblez beaucoup compliquer les choses, j’utiliserais simplement:

 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[az\d\-]+(\.[az]+)*\.[az]+\z/i 

qui est tiré du livre de rails de Michael Hart

comme cela ne répond pas à votre exigence de point, il peut simplement être modifié comme suit:

 VALID_EMAIL_REGEX = /\A([\w+\-]\.?)+@[az\d\-]+(\.[az]+)*\.[az]+\z/i 

Comme mentionné par CAustin, il existe de nombreuses autres solutions.

MODIFIER:

@installero a fait remarquer que l’original échouait pour les sous-domaines avec des traits d’union, cette version fonctionnera (on ne sait pas pourquoi la classe de caractères manquait de chiffres et de tirets).

 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[az\d\-]+(\.[az\d\-]+)*\.[az]+\z/i 

Voici un excellent article de David Celis expliquant pourquoi chaque expression régulière que vous pouvez trouver pour valider les adresses e-mail est incorrecte, y compris celles affichées par Mike.

De l’article:

La chaîne locale (la partie de l’adresse e-mail qui précède le @) peut contenir les caractères suivants:

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

Mais devinez quoi? Vous pouvez utiliser à peu près n’importe quel personnage que vous voulez si vous y échappez en l’entourant de guillemets. Par exemple, “Regardez tous ces espaces!” @ Exemple.com est une adresse électronique valide. Agréable.

Si vous devez effectuer une vérification de base, la meilleure expression régulière est simplement /@/ .

Celui-ci est plus court et sûr:

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

Le régulier est utilisé dans la gemme Devise. Mais il comporte des vulnérabilités pour ces valeurs:

  ".....@a....", "david.gilbertson@SOME+THING-ODD!!.com", "ab@example,com", "ab@example,co.de" 

Je préfère utiliser regexp depuis la bibliothèque ruby URI::MailTo::EMAIL_REGEXP

Il y a un bijou pour les validations d’email

Email Validator

Cela a été intégré dans la bibliothèque standard depuis au moins 2.2.1

 URI::MailTo::EMAIL_REGEXP 

Actuellement, Ruby fournit une expression rationnelle de validation de courrier électronique dans sa bibliothèque standard. Vous pouvez le trouver dans le module URI::MailTo , c’est URI::MailTo::EMAIL_REGEXP . Dans Ruby 2.4.1, il évalue à

 /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[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/ 

Mais je voudrais juste utiliser la constante elle-même.

Je suppose que l’exemple du livre peut être amélioré pour faire correspondre les emails avec - dans le sous-domaine.

 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[az\d\-]+(\.[az\d\-]+)*\.[az]+\z/i 

Par exemple:

 > 'some@email.with-subdomain.com' =~ VALID_EMAIL_REGEX => 0 

Le tien est compliqué en effet.

 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[az\d\-.]+\.[az]+\z/i 

Le code ci-dessus devrait suffire.

Explication de chaque partie de l’expression ci-dessus pour clarification:

Début de regex:

 / 

Faire correspondre le début d’une chaîne:

 \A 

Au moins un caractère de mot, plus, un trait d’union ou un point:

 [\w+\-.]+ 

Un littéral “at sign”:

 @ 

Un point littéral:

 \. 

Au moins une lettre:

 [az]+ 

Correspond à la fin d’une chaîne:

 \z 

Fin de regex:

 / 

Insensible à la casse:

 i 

Le remettre ensemble:

 /\A[\w+\-.]+@[az\d\-.]+\.[az]+\z/i 

Consultez Rubular pour tester facilement vos expressions lorsque vous les écrivez.

essaye ça!!!

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

seulement la chaîne email sélectionnée

 "Robert Donhan" sadfadf Robert Donhan  "Robert Donhan" abc.bob@email.comasdfadf Robert Donhan bob@email.comadfd 

Cela fonctionne bien pour moi:

 if email.match?('[a-z0-9]+[_a-z0-9\.-]*[a-z0-9]+@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[az]{2,4})') puts 'matches!' else puts 'it doesn\'t match!' end