Rexact
Cheatsheet

Regex SSN américain

Un SSN, ce n'est pas juste « NNN-NN-NNNN » : la SSA interdit certaines plages précises (préfixe 000/666/900-999, groupe 00, série 0000). Le paquet npm ssn-validator applique ces plages correctement, mais rend chaque tiret optionnel indépendamment — un format incohérent comme « 123-45 6789 » passe. Il doit d'ailleurs ajouter une liste noire à la main pour rejeter le tristement célèbre 078-05-1120, un SSN utilisé par erreur dans des publicités pendant des décennies : aucune plage ne peut détecter ce cas, seule une liste explicite le peut. Voici un motif qui applique fidèlement les plages officielles, comparé à ces trois tentatives.

/^(?!000|666|9\d{2})\d{3}-(?!00)\d{2}-(?!0{4})\d{4}$/
passe 20/20 cas

Comparatif des patterns existants

Implémentation

const re = new RegExp("^(?!000|666|9\\d{2})\\d{3}-(?!00)\\d{2}-(?!0{4})\\d{4}$", "");
re.test(input);

Limites

  • Valide seulement les PLAGES officiellement interdites (area 000/666/900-999, group 00, serial 0000) : ne peut jamais détecter un numéro officiellement compromis comme 078-05-1120, resté en circulation des décennies dans des publicités et des portefeuilles-échantillons — aucune règle de plage ne couvre ce cas, seule une liste explicite le peut.
  • Ne consulte pas la base de vérification SSA (SSNVS, réservée aux employeurs autorisés) : seule cette vérification confirme qu'un SSN est réellement attribué à une personne.
  • La SSA a cessé d'attribuer les SSN selon une logique géographique/chronologique déductible depuis la randomisation du 25 juin 2011 : la structure area/group/serial existe toujours dans le format, mais n'a plus de signification exploitable.
  • Exige un tiret littéral aux deux positions : les formats avec espaces ou sans aucun séparateur, parfois tolérés par des formulaires, doivent être normalisés avant validation par ce motif.