Regex email
Valider une adresse email semble trivial — jusqu'à ce que la regex accepte des adresses invalides ou en rejette des valides. Voici un motif réellement testé, comparé aux motifs les plus copiés, avec leurs limites documentées.
/^[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])?)*$/passe 21/21 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — réponse la plus simple (Andy Lester) | ^\S+@\S+\.\S+$ | 14 / 21 | vulnérable (@@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@…) |
| 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 | sûr |
| 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 | indéterminé |
Implémentation
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);Limites
- 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.