Rexact
Cheatsheet

Regex Danish CPR number

A CPR is written '070761-4285': DDMMYY, an optional hyphen and 4 digits. The century is derived from the 7th digit and the year by an official table. Old rule: the weighted sum (4,3,2,7,6,5,4,3,2,1) had to be divisible by 11. But the CPR office writes on its site that since 2007 it assigns numbers 'uden såkaldt modulus 11 kontrol', which are 'fuldt ud gyldige personnumre': systems must accept them. The angular-cpr-validator library nonetheless requires modulo 11 by default and rejects them, a gist requires the hyphen, and OS2datascanner's, built for detection, accepts '320131-4006'. Here's a pattern bounding month and day without requiring the check, compared against those attempts.

/^(?:0[1-9]|[12][0-9]|3[01])(?:0[1-9]|1[0-2])[0-9]{2}-?[0-9]{4}$/
passes 24/24 cases

Comparison of existing patterns

Implementation

const re = new RegExp("^(?:0[1-9]|[12][0-9]|3[01])(?:0[1-9]|1[0-2])[0-9]{2}-?[0-9]{4}$", "");
re.test(input);

Limits

  • Valide seulement la FORME : ne vérifie ni le modulo 11 (qui n'est plus une condition de validité depuis 2007 d'après le CPR-kontor), ni le nombre de jours du mois (« 300232-4006 », 30 février, passe), ni les années bissextiles : « 290201-4123 » (2001) passe. Le siècle découle d'une table officielle (7e chiffre et année) que ce motif ne reprend pas : « 290200-0123 » (1900, non bissextile) passe aussi.
  • Le contrôle modulo 11 reste utile comme indice, mais plus comme test de validité : les numéros sans clé sont attribués pour certaines générations parce que les numéros avec clé s'épuisent. Beaucoup de bibliothèques l'imposent encore (angular-cpr-validator, danish-ssn).
  • Tout CPR bien formé peut appartenir à une personne réelle : n'utilisez que le numéro d'exemple du document du CPR-kontor (070761-4285) ou des numéros dont la date de naissance est dans le futur, comme ceux du corpus. Les jeux de données de test officiels (Fællesoffentlige Testdatasæt) ne sont pas listés publiquement.
  • Le tiret est facultatif. Les espaces, points et barres tolérés par certains détecteurs sont rejetés : normalisez avant validation. Le motif ne distingue pas un numéro attribué d'un numéro non attribué.

Related pages