Rexact
Cheatsheet

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

SourcepatternScore on the corpusReDoS
Stack Overflow — réponse la plus simple (Andy Lester)^\S+@\S+\.\S+$14 / 21vulnerable (@@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@…)
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 / 21safe
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 / 21undetermined

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.

Related pages