Rexact
Cheatsheet

Regex strong password

The most copied password regex in the world (2.4k votes on Stack Overflow) has a real flaw: its special-character whitelist silently rejects any password containing a comma, a period, or an unlisted symbol. Here's a pattern that enforces the same rules without restricting which characters are allowed.

/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\W)(?!.* ).{8,}$/
passes 20/20 cases

Comparison of existing patterns

SourcepatternScore on the corpusReDoS
Stack Overflow — réponse la plus votée au monde sur le sujet, 2,4k votes (Srinivas)^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$15 / 20undetermined
Stack Overflow — variante « simple » de la même réponse (lettres + chiffre seulement)^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$8 / 20undetermined
Stack Overflow — réponse à 67 votes, non adaptée (plafond de 16 caractères conservé)^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\W)(?!.* ).{8,16}$19 / 20undetermined

Implementation

const re = new RegExp("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*\\W)(?!.* ).{8,}$", "");
re.test(input);

Limits

  • Valide seulement la forme (longueur + catégories de caractères), jamais la résistance réelle : « Passw0rd! » satisfait la règle mais reste un mot de passe trivial à deviner (dictionnaire + substitutions courantes).
  • N'interdit que l'espace littéral : une tabulation ou un retour à la ligne collé par erreur passe silencieusement (voir le cas « Tab\tPass1! » du corpus).
  • Aucune vérification contre une liste de mots de passe compromis (ex. Have I Been Pwned) — la seule protection réellement efficace selon NIST 800-63B, qu'une regex ne peut pas fournir.
  • Le plafond de longueur a été volontairement retiré ({8,} au lieu de {8,16}) : un plafond bas rejette les phrases de passe longues, pourtant recommandées, sans bénéfice de sécurité réel.