7
votes

Quel est le problème avec cette regex pour la validation des courriels?

Voici une regex de validation de courriels - \ s + \ \ s + \. \ s + , je ne l'ai pas écrit. Je suis nouveau dans des expressions régulières et je ne les comprends pas tout ça.

J'ai quelques questions:

  1. Qu'est-ce que mauvais avec la regex ci-dessus?
  2. Qu'est-ce qu'un bon regex pour Validation de courriels?

9 commentaires

Quelles preuves avez-vous que quelque chose ne va pas avec la regex? Ne manquez-t-il pas de correspondre à certains modèles? lesquels? Il est extrêmement difficile pour nous de répondre "Qu'est-ce qui ne va pas?" sans aucune indication que quelque chose est réellement faux.


Qui veut être le premier à poster le courriel de trois pages Regex?


Quant à ce qui ne va pas avec ça: Eh bien, pour une chose, cela ne permet pas aux points dans la première partie. Cela disqualifierait deux de mes trois adresses électroniques. En outre, il n'autorise qu'un point dans la deuxième partie, qui disqualifie les domaines tels que ".fr .f.uk".


@myers merci beaucoup, c'est le genre de réponse que je cherchais.


Il ne permet pas non plus que le signe "+" dans les noms d'utilisateur, qui est légal. La partie après le signe "+" est ignorée, mais beaucoup de gens l'utilisent pour filtrer les courriels. Par exemple, étant donné le nom d'utilisateur "utilisateur@gmail.com", une personne peut utiliser "utilisateur+amazon@gmazon@gmail.com" comme un e-mail Amazon, leur permettant de filtrer facilement le courrier (ou une piste si un service particulier donne son adresse e-mail à un autre service).


C'est un bon, Mipadi. J'adore en utilisant ça et serez sérieusement en colère lorsqu'un site Web ne me laisse pas.


Qu'entendez-vous que vous voulez dire? Correspond à n'importe quel personnage non-espaces.


En effet, Alan a raison. miPadi et mmyers , vous avez tous les deux tort: ​​ \ s correspond à la fois au . (dot) et + .


Dupliqué possible de Quelle est la meilleure expression régulière pour la validation du courrier électronique adresses?


5 Réponses :


18
votes

"Comment valider un e-mail avec regex" est l'une des questions les plus populaires qui se posent lorsqu'il s'agit d'expressions régulières et la seule vraie bonne réponse est "Vous ne" pas ". Il a été discuté dans ce site web très web dans beaucoup Occasions . Ce que vous devez comprendre, c'est que si vous vouliez vraiment suivre les spécifications, votre regex ressemblerait à quelque chose comme Ceci . De toute évidence, c'est une monstruosité et est plus un exercice pour démontrer à quel point il est ridiculement difficile à adhérer à ce que vous êtes censé pouvoir accepter. Avec cela à l'esprit, si vous avez absolument besoin de savoir que l'adresse e-mail est valide, le seul moyen réel de vérifier que c'est d'envoyer un message à l'adresse e-mail et de vérifier si elle rebondit ou non. Sinon, Cette regex validera correctement la plupart des cas, et dans de nombreuses situations la plupart des cas est assez. En outre, cette page discutera des problèmes d'essai de valider des courriels avec regex.


0 commentaires

2
votes

Quel est le problème avec la regex ci-dessus?

Cela ne vérifie que "@" et a. Il existe de nombreuses choses qui ne sont certainement pas des adresses électroniques légitimes qui correspondraient à cette combinaison.

Par exemple, si une personne a écrit user@www.mywebsite.com, cela correspondrait, mais c'est évidemment une erreur. Un peu plus de sophistication dans la regex l'attraperait et aiderait l'utilisateur.

idito s'il a mis à l'utilisateur@mywebsite.nt - il a orthographié 'net'. Ou il a mis en deux @@ 's (user @@ yahoo.com / user @ yahoo @ yahoo.com - qui est en fait assez courant), ou deux points (utilisateur @ yahoo..com). Une meilleure regex devrait les attraper.

[Bien que de meilleurs chèques soient souvent arrêtés sur d'autres erreurs, ces points multiples juridiques avant et après le "AT" qui pourraient être supprimés ou invalidés (mon.name@gmail.com)]

Si vous ne voulez pas être difficile, vous n'avez même pas besoin d'une regex. Indexof ('@')! = -1 attrapera la plupart des erreurs. Une fois vérifié, vous devriez faire mieux.

Qu'est-ce qu'une bonne regex pour la validation des emails?

http://www.gooli.org/blog/useful-regular- expressions

http://www.regular-expressions.info/email.html


3 commentaires

utilisateur@www.mywebsite.com est une adresse e-mail valide.


Vraiment?! Si je fais myName@www.yahoo.com, vais-je l'obtenir? Bien que maintenant que j'y pense, quelque chose se termine par .nt pourrait être techniquement aussi. Il est toujours correct d'attraper et de vérifier les deux ci-dessus.


Il est assez courant d'avoir plusieurs points dans la seconde moitié d'un courrier électronique, tel que johnny@corporate.example.com



-1
votes

Quel est le problème avec la regex ci-dessus?

La norme RFC822 pour les adresses électroniques est très lâche, il est donc difficile de trouver une expression régulière de TERSE qui capture tous les courriels valides possibles. La question est compliquée par le fait que tous les serveurs de messagerie / client appliquent cette norme, de sorte que les données réelles peuvent être

Pendant que vous pouvez certainement deviner ou appliquer un format particulier, la rédaction d'une expression ad-hoc est à peu près garantie que vous aurez de nombreuses adresses e-mail indésirables ou de refuser les valides.

Qu'est-ce qu'une bonne regex pour la validation de courriels?

Il s'agit de la réégalité de référence pour la validation de la RFC, sa mise en œuvre en tant que module PERL ici, mais constitue également la liste finale de O'Reillys "Maîtriser régulièrement des expressions régulières"

Mail :: RFC822 :: Adresse < / p>


0 commentaires

7
votes

Je vais seulement répondre à votre première question et à partir d'un point de vue technique de regex technique .

Qu'est-ce qui ne va pas avec le regex \ s + \ \ s + \. \ s + , est-ce que cela a le potentiel de s'exécuter trop lentement. Que se passe-t-il si quelqu'un entre dans une chaîne de messagerie comme celle ci-dessous et que vous devez la valider?

A@B.CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

ou même pire (oui, qui sont 100 @ 's après le point):

@. @. @@@@@@@@@@@@@@@ l @@@@@@ \ @@@@@@@@@@@@@@@@@@@@@@@@@ \ @@@@@@@@@@@@@@@@@ @@@@@@@

La moelleuse arrive. Premièrement, la regex correspondrait à de nombreux caractères que possible pour le premier \ s + . Donc, cela correspondra à l'ensemble de la chaîne entière. Ensuite, nous avons besoin du caractère @, de sorte qu'il va revenir en arrière jusqu'à ce qu'il en trouve un. À ce point, nous avons un autre \ s + , donc, encore une fois, cela consommera tout jusqu'à la fin de la chaîne. Ensuite, il faut revenir en arrière jusqu'à ce qu'il trouve un point. Pouvez-vous imaginer à quel point la backtracking se produit avant que la regex échoue finalement sur la deuxième chaîne de messagerie?

Pour tuer la rampe, je suggère d'utiliser des classes de caractères possessifs dans ce cas, qui bénéficient de l'avantage supplémentaire de ne pas autoriser de multiples @'s dans une chaîne.

[^ @ \ s] ++ @ [^ @ \ \ s.] ++ \. [^ @ \ s] ++

J'ai fait une référence rapide pour les deux regexnes contre le "100 @" S ". Le mien est d'environ 95 fois plus vite.


2 commentaires

Hé Geert, ravi de vous voir ici. À propos de l'heure d'exécution de la regex: je ne pense pas que cela importe beaucoup dans ce cas, à moins que vous ne valais pas pour valider des milliers d'adresses en très peu de temps ou si l'adresse est de milliers de caractères. (Mais nous avons eu cette discussion avant :)) Cordialement, Bart (Prométheuzz).


Je dois me demander combien plus lentement la regex pergissive que l'énorme regex RFC, je suppose que c'est encore beaucoup plus rapide que cela, de sorte que la performance, dans ce cas, ne semble pas être une préoccupation majeure. Essentiellement, 95 fois lentement que 1 Miliseconde, ne représentent que 95 millions de dollars, négligables. Alors, quel genre de ralentissement parle-t-on ici?



2
votes

Je vois que @liam Posté Un lien vers le RFC822 . Mais, en tenant compte de l'idée que Stackoverflow est une destination et en cas d'extarrot.com enlève le lien, ou qu'avez-vous. Dans sa teneur ...

Mail :: RFC822 :: Adresse: Validation de l'adresse Regexp

Mail :: RFC822 :: Adresse est un module Perl pour valider les adresses e-mail en fonction du RFC 822 grammaire . Il fournit la même fonctionnalité que RFC :: RFC822 :: Adresse, mais utilise des expressions régulières Perl plutôt que la parse :: analyseur de recdescence. Cela signifie que le module est beaucoup plus rapide à charger car il n'a pas besoin de compiler la grammaire au démarrage.

Télécharger Mail :: Rfc822 :: adresse-0.4.tar.gz ou Lire la documentation .

La grammaire décrite dans RFC 822 est complexe de manière supracente. La validation de la mise en œuvre avec des expressions régulières poussent quelque peu les limites de ce qu'il est judicieux de faire avec des expressions régulières, bien que Perl excépage bien: xxx

Cette expression régulière ne validera que les adresses qui ont eu Tout commentaire dépouillé et remplacé par WhitSpace (cela se fait par le module).


0 commentaires