Regex numéro d'identité norvégien (fødselsnummer)
Un fødselsnummer a 11 chiffres : JJMMAA, un numéro individuel de 3 chiffres et 2 chiffres de contrôle modulo 11. Skatteetaten précise que le D-nummer (étrangers de passage) ajoute 4 au premier chiffre du jour, soit les jours 41 à 71. Les numéros H (aide à l'identité) ajoutent 40 au mois, les numéros de test 80. Les regex de blogs norvégiens s'arrêtent souvent aux numéros ordinaires : celle d'Epinova rejette tout D-nummer et H-nummer. Celle de golimb accepte le jour 32 et le mois 13, et son « [0-9][1-9] » rejette pourtant le jour 50, 60 ou 70 d'un D-nummer. Voici un motif qui borne jour et mois pour les trois types, comparé à ces tentatives.
/^(?:0[1-9]|[12][0-9]|3[01]|4[1-9]|[56][0-9]|7[01])(?:0[1-9]|1[0-2]|4[1-9]|5[0-2]|8[1-9]|9[0-2])[0-9]{7}$/passe 23/23 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| navikt/fnrvalidator (npm, ~53 000 téléchargements/mois) — « ^\d{11}$ » : jour 99, mois 99 et 00000000000 passent ; la date est testée ensuite dans le code ; django-localflavor (no) a la même regex | ^\d{11}$ | 19 / 23 | sûr |
| golimb (blog, « Personnummer, H-nummer og D-nummer ») — « [0-9][1-9] » accepte les jours 32-39 et les mois 13-19 (jour 32, mois 13 passent) mais rejette les jours 50, 60, 70 d'un D-nummer et les mois 50 d'un H-nummer (le deuxième chiffre doit être non nul) ; l'auteur dit lui-même qu'elles ne sont « pas parfaites » | ^([0-9][1-9]|[1-2][0-9]|31(?!(?:0[2469]|11))|30(?!02))([0-9][1-9]|1[0-2])(\d{2})(\s?)(\d{5})$ | 20 / 23 | sûr |
| Epinova (blog, regex-huskeliste pour Episerver Forms) — jours et mois bien bornés pour les numéros ordinaires (rejette 31 avril et 30 février) ; mais tout D-nummer et H-nummer est rejeté | ^(0[1-9]|[1-2][0-9]|31(?!(?:0[2469]|11))|30(?!02))(0[1-9]|1[0-2])\d{7}$ | 19 / 23 | sûr |
Implémentation
const re = new RegExp("^(?:0[1-9]|[12][0-9]|3[01]|4[1-9]|[56][0-9]|7[01])(?:0[1-9]|1[0-2]|4[1-9]|5[0-2]|8[1-9]|9[0-2])[0-9]{7}$", "");
re.test(input);Limites
- Valide seulement la FORME : ne calcule pas les deux chiffres de contrôle modulo 11. « 13097248032 » et « 13097248023 » ont la bonne forme mais une clé fausse et passent ce motif. Ne valide pas non plus le jour dans le mois (« 29020112345 », 29 février 2001, passe).
- Le jour accepte 01-31 et 41-71 (D-nummer), le mois 01-12, 41-52 (H-nummer) et 81-92 (numéros de test). Les D- et H-nummer viennent de la source officielle pour le D (premier chiffre + 4) mais du code de navikt/fnrvalidator pour H et T ; les numéros FH, sans date de naissance par conception, ne sont pas couverts.
- À partir du 1er janvier 2032, le calcul du premier chiffre de contrôle accepte quatre valeurs et le numéro n'encode plus ni le sexe ni le siècle : le motif de forme reste valable, mais la clé et la lecture du numéro changent.
- Les exemples sont des numéros autogénérés des tests de navikt/fnrvalidator, dont le README précise qu'ils ne correspondent à personne ; n'utilisez pas de vrais numéros d'identité dans vos tests.