Regex Rodné číslo tchèque (numéro de naissance)
Le rodné číslo s'écrit AAMMJJ/NNNN, la barre étant facultative. Selon la loi tchèque n° 133/2000 Sb. (§ 13), il a 10 chiffres et est divisible par 11, le mois étant augmenté de 50 pour les femmes ; les numéros attribués avant le 1er janvier 1954 n'ont que 9 chiffres (série de 3 chiffres) et ne sont pas soumis à la divisibilité par 11 ; lorsque la série du jour est épuisée, le mois est augmenté de 20 pour les hommes et de 70 pour les femmes. La regex borne donc le mois selon la longueur : 01-12 ou 51-62 pour 9 chiffres (année 00-53), 01-12, 21-32, 51-62 ou 71-82 pour 10 chiffres. La divisibilité par 11 des numéros à 10 chiffres est la clé : elle se contrôle en code (voir les limites). Les trois tentatives réelles relues ne bornent ni le mois, ni le jour, ni la longueur selon l'année.
/^(?:(?:[0-4]\d|5[0-3])(?:0[1-9]|1[0-2]|5[1-9]|6[0-2])(?:0[1-9]|[12]\d|3[01])\/?\d{3}|\d{2}(?:0[1-9]|1[0-2]|2[1-9]|3[0-2]|5[1-9]|6[0-2]|7[1-9]|8[0-2])(?:0[1-9]|[12]\d|3[01])\/?\d{4})$/Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js isTaxID (cs-CZ) — ancrée, barre facultative, 3 ou 4 chiffres de série ; ni mois ni jour bornés : « 991399123 » et « 1313130000 » passent | ^\d{6}\/{0,1}\d{3,4}$ | 18 / 25 | sûr |
| piigex (détecteur cz_rc) — lookarounds sans ancres de chaîne : « RC 7103192745 » et « x-7103192745 » passent ; mois et jour libres | (?<!\d)\d{6}/?[\d]{3,4}(?!\d) | 17 / 25 | sûr |
| OpenRedaction (CZECH_NATIONAL_ID, regex de détection) — exige la barre : « 7103192745 » (forme usuelle sans barre) est rejeté ; mois et jour non bornés | \b(\d{6}\/\d{4})\b | 14 / 25 | sûr |
Implémentation
const re = new RegExp("^(?:(?:[0-4]\\d|5[0-3])(?:0[1-9]|1[0-2]|5[1-9]|6[0-2])(?:0[1-9]|[12]\\d|3[01])\\/?\\d{3}|\\d{2}(?:0[1-9]|1[0-2]|2[1-9]|3[0-2]|5[1-9]|6[0-2]|7[1-9]|8[0-2])(?:0[1-9]|[12]\\d|3[01])\\/?\\d{4})$", "");
re.test(input);Limites
- Valide la forme (longueur selon l'année, mois codés, jour) mais PAS la divisibilité par 11 des numéros à 10 chiffres : « 7103192746 » a la bonne forme et passe. Complément : pour 10 chiffres, valide si Number(BigInt(chaîne sans barre) % 11n) === 0.
- Le jour 31 est accepté pour tous les mois (« 990431123… » = 31 avril passe) et la date n'est pas confrontée à aujourd'hui. Pour 10 chiffres, l'année 00-26 vaut 2000-2026, 54-99 vaut 1954-1999, mais 27-53 reste ambigu (non attribué dans les faits) : le motif ne le tranche pas.
- Un 9 chiffres d'année 54 à 99 est refusé (naissance avant 1954 exigée par la loi) ; les numéros slovaques d'avant 1993 reconnus par la loi suivent la même structure. La barre est facultative, les espaces sont rejetés. Un rodné číslo est une donnée personnelle : n'utilisez que des numéros d'exemple ou synthétiques à jour impossible.