Rexact
Cheatsheet

Regex French social security number (NIR)

Two separate open-source libraries used to validate the French NIR each had a real bug in their birth-month range, fixed via a real, dated GitHub issue. Here's the current version of the Assurance Maladie's own validator, compared against the historical (buggy) versions of both projects.

/^(?<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
passes 20/20 cases

Comparison of existing patterns

SourcepatternScore on the 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 / 20safe
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 / 20safe
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 / 20safe

Implementation

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);

Limits

  • 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.

Related pages