web-dev-qa-db-fra.com

Validation de Ruby Email avec regex

J'ai une longue liste de courriels. Beaucoup de courriels ont des fautes de frappe. J'essaie de construire une chaîne qui vérifiera les courriels valides. 

c'est ce que j'ai pour 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 en tant que soulignés et seulement une période. J'ai beaucoup de courriels qui ont plus d'un point dans le nom même. Comment puis-je vérifier cela dans regex. 

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

Est-ce que quelqu'un peut m'aider à réécrire mon regex? 

41
T0ny lombardi

TL; DR:

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

Réponse originale

Vous semblez beaucoup compliquer les choses, je voudrais simplement utiliser:

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

qui est tiré de le livre de Rails de michael hartl

comme cela ne répond pas à vos besoins en points, vous pouvez simplement le modifier comme suit:

VALID_EMAIL_REGEX = /\A([\w+\-]\.?)+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\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 contenant des traits d'union, cette version fonctionnera (vous ne savez pas pourquoi la classe de caractères manquait de chiffres et de traits d'union).

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

Ceci est intégré à la bibliothèque standard depuis au moins 2.2.1.

URI::MailTo::EMAIL_REGEXP
25
Joshua Hunter

Voici un excellent article de David Celis expliquant pourquoi chaque expression régulière que vous pouvez trouver pour valider des adresses électroniques est fausse, y compris celles mentionnées ci-dessus par Mike.

De l'article:

La chaîne locale (la partie de l'adresse électronique précédant 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 entre guillemets. Par exemple, "Regardez tous ces espaces!" @ Example.com est un Adresse e-mail valable. Agréable.

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

24
John Carney

Celui-ci est plus court et sûr:

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

La règle est utilisée dans Devise gem . Mais elle comporte certaines vulnérabilités pour ces valeurs:

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

Je préfère utiliser l'expression rationnelle de la bibliothèque Ruby URI::MailTo::EMAIL_REGEXP

Il y a un petit bijou pour les validations d'email

Email Validator

17
ilgam

De nos jours, 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 est évalué à

/\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 n'utiliserais que la constante elle-même.

10
kaikuchn

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

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

Par exemple:

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

Le votre est compliqué en effet.

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

Le code ci-dessus devrait suffire.

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

Début de regex:

/

Correspond au début d'une chaîne:

\A

Au moins un caractère Word, plus, trait d'union ou point:

[\w+\-.]+

Un "au signe" littéral:

@

Un point littéral:

\.

Au moins une lettre:

[a-z]+

Correspond à la fin d'une chaîne:

\z

Fin de regex:

/

Insensible à la casse:

i

Le remonter à nouveau:

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

Consultez Rubular pour tester facilement vos expressions au fur et à mesure que vous les écrivez.

1
bdbasinger

essaye ça!!!

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

seule chaîne de courrier électronique sélectionnée

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