Regex Dutch BSN (burgerservicenummer)
A BSN is a 9-digit number whose last digit is an 'elfproef' (11-test) key: the first 8 digits weighted 9, 8, 7, 6, 5, 4, 3, 2 must sum to the 9th digit modulo 11 (equivalently, weight the last digit -1 and require a sum divisible by 11); a remainder of 10 makes the number invalid (DG TAXUD specification). A regex cannot compute that modulo 11: it checks the shape, and you then need a code check. Complement to write after the regex: sum = Σ digit[i] × (9 − i) for i from 0 to 7, valid if (sum − digit[8]) % 11 === 0 and the number is not '000000000', which passes the modulo without being a BSN. The real attempts I read do not all handle these bounds: one demands exactly 9 digits without rejecting zeros, another is unanchored and accepts '111222333' inside a sentence, a third stops after 8 digits.
/^(?!0{9}$)\d{9}$/Comparison of existing patterns
Implementation
const re = new RegExp("^(?!0{9}$)\\d{9}$", "");
re.test(input);Limits
- Valide seulement la FORME (9 chiffres, pas tout à zéro) : ne calcule pas la clé elfproef. « 111222334 » et « 174559435 » ont la bonne forme et une clé fausse, et passent ce motif. Ajoutez le contrôle de code donné dans l'introduction.
- Un BSN à 8 chiffres (zéro initial omis, selon des sources secondaires) est rejeté : complétez à 9 chiffres avec un zéro avant de valider, puis appliquez la regex. Les formes avec points ou espaces (« 1112.22.333 ») sont aussi rejetées : normalisez d'abord.
- Ne dit rien de l'existence ni de l'attribution du numéro (seul le registre BRP le sait). Un BSN est une donnée personnelle sensible : n'utilisez en test que des numéros d'exemple ou synthétiques, comme ceux du corpus.