Rexact
Cheatsheet

Regex numéro de sécurité sociale (NIR)

Deux bibliothèques open source distinctes utilisées pour valider le NIR français ont chacune eu un vrai bug sur la plage du mois de naissance, corrigé via un ticket GitHub réel et daté. Voici la version actuelle du validateur de l'Assurance Maladie, comparée aux versions historiques (bugguées) des deux projets.

/^(?<sexe>[12])(?<annee>\d{2})(?<mois>0[1-9]|1[0-2]|[2-9][0-9])(?<dept>\d{2}|2A|2B)(?<commune>\d{3})(?<rang>\d{3})(?<cle>9[0-7]|[0-8]\d)?$/i
passe 20/20 cas

Comparatif des patterns existants

SourcepatternScore sur le corpusReDoS
Cnamts nir-validation — version antérieure à octobre 2024, mois limité à 01-12 (Fix #20)^(?<sexe>[12])(?<annee>\d{2})(?<mois>1[0-2]|0[1-9])(?<dept>\d{2}|2A|2B)(?<commune>\d{3})(?<rang>\d{3})(?<cle>9[0-7]|[0-8]\d)?$15 / 20sûr
IsoCodes (803 étoiles) — version antérieure à mai 2021, plage de mois avec un trou (21-29, 30)^(?<sexe>[123478])(?<annee>[0-9]{2})(?<mois>0[1-9]|1[0-2]|3[1-9]|4[0-2]|[5-9][0-9]|20)(?<dept>[0][1-9]|2[AB]|[1-9][0-9])(?<commune>[0-9]{3})(?<rang>00[1-9]|0[1-9][0-9]|[1-9][0-9]{2})(?<cle>0[1-9]|[1-8][0-9]|9[0-7])?$15 / 20sûr
IsoCodes — version actuelle, corrigée mais avec son propre trou résiduel (43-49)^(?<sexe>[123478])(?<annee>[0-9]{2})(?<mois>0[1-9]|1[0-2]|[2-3][0-9]|4[0-2]|[5-9][0-9])(?<dept>[0][1-9]|2[AB]|[1-9][0-9])(?<commune>[0-9]{3})(?<rang>00[1-9]|0[1-9][0-9]|[1-9][0-9]{2})(?<cle>0[1-9]|[1-8][0-9]|9[0-7])?$16 / 20sûr

Implémentation

const re = new RegExp("^(?<sexe>[12])(?<annee>\\d{2})(?<mois>0[1-9]|1[0-2]|[2-9][0-9])(?<dept>\\d{2}|2A|2B)(?<commune>\\d{3})(?<rang>\\d{3})(?<cle>9[0-7]|[0-8]\\d)?$", "i");
re.test(input);

Limites

  • Valide seulement la forme, jamais la clé de contrôle (calculée par 97 moins le reste de la division par 97 des 13 premiers chiffres, ISO 7064) : une chaîne de la bonne forme peut être un NIR totalement inventé.
  • Se limite volontairement au NIR définitif (sexe 1/2) : le NIA, numéro provisoire attribué aux personnes en cours d'immatriculation (sexe 3, 4, 7 ou 8), est une entité différente que l'Assurance Maladie valide via une règle séparée — les fusionner dans un seul motif, comme le fait la bibliothèque IsoCodes, est un choix de conception défendable mais différent.
  • N'exige aucun espace mais n'en interdit pas l'usage réel : un NIR est presque toujours affiché en groupes espacés (« 2 55 08 14 168 025 38 ») — il faut retirer les espaces avant de tester avec ce motif.
  • La clé de contrôle, quand elle est présente, doit faire exactement 2 chiffres : un NIR à 13 chiffres (sans clé) et un NIR à 15 chiffres (avec clé) sont tous deux acceptés, mais rien entre les deux.

Pages liées