Regex Code personnel estonien (isikukood)
L'isikukood a 11 chiffres : un chiffre de siècle et de sexe (1 à 6), l'année sur 2 chiffres, le mois (01-12), le jour (01-31), un numéro de série (001 à 710 d'après la spécification DG TAXUD) et une clé modulo 11 à deux jeux de poids (1 à 9 puis 1, et 3 à 9 puis 1, 2, 3 si le premier reste vaut 10). Les trois tentatives réelles relues n'ont pas toutes ces bornes : l'une n'accepte que des chiffres sans contrôler mois ni jour, une autre n'est pas ancrée, et une troisième contrôle la série mais accepte « 39913330010 » (mois 13, jour 33). Voici un motif qui borne siècle, mois, jour et série, comparé à ces tentatives. La clé et l'existence du jour (31 février) restent à vérifier par du code.
/^[1-6]\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])(?:00[1-9]|0[1-9]\d|[1-6]\d{2}|70\d|710)\d$/passe 24/24 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js isTaxID (et-EE) — borne le siècle et la série 001-710 mais pas le mois ni le jour : « 39913330010 » (mois 13, jour 33) passe | ^[1-6]\d{6}(00[1-9]|0[1-9][0-9]|[1-6][0-9]{2}|70[0-9]|710)\d$ | 21 / 24 | sûr |
| django-localflavor (EEPersonalIdentificationCode) — ancrée, siècle 1-6, mais mois, jour et série libres : « 39913330010 » et « 30001010000 » passent | ^([1-6])(\d\d)(\d\d)(\d\d)(?:\d{3})(\d)$ | 19 / 24 | sûr |
| piigex (détecteur ee_ik) — siècle 1-6 seulement ; lookarounds sans ancres de chaîne (« x-37102250382 » passe), ni mois, ni jour, ni série | (?<!\d)[1-6]\d{10}(?!\d) | 18 / 24 | sûr |
Implémentation
const re = new RegExp("^[1-6]\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])(?:00[1-9]|0[1-9]\\d|[1-6]\\d{2}|70\\d|710)\\d$", "");
re.test(input);Limites
- Valide la forme (siècle, mois, jour, série) mais PAS la clé modulo 11 : « 37102250383 » passe. Complément : s1 = Σ chiffre[i] × ((i % 9) + 1) pour les 10 premiers chiffres, modulo 11 ; si s1 vaut 10, s2 = Σ chiffre[i] × (((i + 2) % 9) + 1) modulo 11 ; la clé est s % 10.
- Le jour 31 est accepté pour tous les mois et le 29 février pour toute année : « 59902 31123… » (31 février) passe ; calculez la date à partir du siècle, de l'année, du mois et du jour pour la vérifier.
- Les chiffres 7 et 8 (siècle 2100, accepté par python-stdnum) sont refusés comme dans la spécification DG TAXUD ; la série est bornée à 001-710 d'après cette spécification, mais d'autres systèmes peuvent émettre au-delà (le code personnel lituanien partage la structure sans cette borne : voir la fiche asmens-kodas-lituanien). Aucune vérification d'existence.
- Un isikukood est une donnée personnelle : n'utilisez que les exemples du document officiel ou des numéros synthétiques à date de naissance future, comme ceux du corpus.