Voici une regex de validation de courriels - J'ai quelques questions: P>
\ s + \ \ s + \. \ s + code>, je ne l'ai pas écrit. Je suis nouveau dans des expressions régulières et je ne les comprends pas tout ça. P>
5 Réponses :
"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 A > beaucoup Occasions . Ce que vous devez comprendre, c'est que si vous vouliez vraiment suivre les spécifications, votre regex ressemblerait à quelque chose comme
Quel est le problème avec la regex ci-dessus? p> blockQuote>
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. P>
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. P>
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. P>
[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)] P>
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. P>
Qu'est-ce qu'une bonne regex pour la validation des emails? P> blockQuote>
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
Quel est le problème avec la regex ci-dessus? strong> 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. P>
Mail :: RFC822 :: Adresse < / p>
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 p>
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" p>
Je vais seulement répondre à votre première question et à partir d'un point de vue technique de regex technique fort>. p>
Qu'est-ce qui ne va pas avec le regex A@B.CDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 P>
ou même pire (oui, qui sont 100 @ 's après le point): p>
@. @. @@@@@@@@@@@@@@@ l @@@@@@ \ @@@@@@@@@@@@@@@@@@@@@@@@@ \ @@@@@@@@@@@@@@@@@ @@@@@@@ P>
La moelleuse arrive. Premièrement, la regex correspondrait à de nombreux caractères que possible pour le premier 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. P>
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. P> \ s + \ \ s + \. \ s + code>, 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? P>
\ s + code>. 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 + code>, 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? P>
[^ @ \ s] ++ @ [^ @ \ \ s.] ++ \. [^ @ \ s] ++ code> p> p> P>
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?
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 P> BlockQuote>
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. P>
Télécharger Mail :: Rfc822 :: adresse-0.4.tar.gz ou Lire la documentation . P> BlockQuote>
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: p>
xxx pré> 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). P> P>
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 i> non-espaces.
En effet, Alan a raison.
miPadi code> et
mmyers code>, vous avez tous les deux tort:
\ s code> correspond à la fois au
. code> (dot) et
+ code>.
Dupliqué possible de Quelle est la meilleure expression régulière pour la validation du courrier électronique adresses?