Regex Lithuanian personal code (asmens kodas)
The asmens kodas has 11 digits: a century and sex digit (1 to 6), the year on 2 digits, the month (01-12), the day (01-31), 3 serial digits and a modulo 11 key identical to Estonia's (two weight sets). The DG TAXUD specification does not bound the serial for Lithuania. validator.js nonetheless reuses the Estonian regex, which limits the serial to 001-710: '33309249990', serial 999, is rejected. django-localflavor settles for '11 digits'. Here's a pattern bounding century, month and day without limiting the serial, compared against those attempts; the key and the existence of the day are left to code.
/^[1-6]\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{4}$/passes 21/21 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| validator.js isTaxID (lt-LT, alias de et-EE) — série limitée à 001-710 : « 33309249990 » et tout asmens kodas de série supérieure à 710 sont rejetés ; mois et jour non bornés | ^[1-6]\d{6}(00[1-9]|0[1-9][0-9]|[1-6][0-9]{2}|70[0-9]|710)\d$ | 13 / 21 | safe |
| django-localflavor (LTPersonalCodeField) — ancrée mais « 11 chiffres » seulement : « 99999999999 » et « 33313329990 » (mois 13, jour 32) passent | ^\d{11}$ | 16 / 21 | safe |
| piigex (détecteur lt_asmens) — siècle 1-6 mais sans ancres de chaîne (« x-33309240064 » passe) ni borne de mois et jour | (?<!\d)[1-6]\d{10}(?!\d) | 17 / 21 | safe |
Implementation
const re = new RegExp("^[1-6]\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{4}$", "");
re.test(input);Limits
- Valide la forme (siècle, mois, jour) mais PAS la clé modulo 11 : « 33309240065 » passe. Même complément de code que pour l'Estonie (deux sommes pondérées, voir la fiche isikukood-estonien).
- Le jour 31 est accepté pour tous les mois et le 29 février pour toute année. La série n'est pas bornée, comme dans le document DG TAXUD.
- python-stdnum accepte aussi un premier chiffre 9 (personnes sans date de naissance connue ?) sans contrôle de date : le document DG TAXUD n'autorise que 1 à 6, et ce motif aussi. Si vous traitez des numéros commençant par 9, élargissez la classe.
- Un asmens kodas est une donnée personnelle : n'utilisez que les exemples du document officiel ou des numéros synthétiques à date de naissance future.