Regex email
Validating an email address looks trivial — until the regex accepts invalid addresses or rejects valid ones. Here's a pattern that's actually tested, compared against the most copied patterns, with documented limits.
/^[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])?)*$/passes 21/21 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — réponse la plus simple (Andy Lester) | ^\S+@\S+\.\S+$ | 14 / 21 | vulnerable (@@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@…) |
| Stack Overflow — variante « simple » citée en alternative à la regex RFC 822 complète | ^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$ | 17 / 21 | safe |
| Stack Overflow — variante RFC 5322 corrigée (ancrée ^…$ pour une validation complète de chaîne) | ^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$ | 19 / 21 | undetermined |
Implementation
const re = new RegExp("^[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])?)*$", "");
re.test(input);Limits
- Valide seulement la forme de l'adresse, jamais son existence réelle : aucune vérification DNS/MX, aucun envoi de confirmation.
- Accepte les domaines à un seul label (ex. « user@example »), valide en théorie (RFC 5321) mais rarement souhaitable dans un formulaire public — pense à le signaler à l'utilisateur plutôt qu'à le bloquer silencieusement.
- Accepte des points consécutifs dans la partie locale (ex. « a..b@example.com »), techniquement invalide selon RFC 5322 strict : le WHATWG assume ce choix comme une simplification volontaire.
- Ne supporte pas les domaines en IP littérale entre crochets (ex. « user@[203.0.113.1] »), pourtant autorisés par RFC 5321.
- N'accepte pas nativement les domaines internationalisés (IDN) : il faut les convertir en Punycode avant validation.