Regex Czech rodné číslo (birth number)
The rodné číslo is written YYMMDD/NNNN, the slash being optional. Under Czech Act 133/2000 Sb. (§ 13), it has 10 digits and is divisible by 11, the month being increased by 50 for women; numbers assigned before 1 January 1954 have only 9 digits (3-digit ending) and are exempt from divisibility by 11; when a day's series is exhausted, the month is increased by 20 for men and by 70 for women. The regex therefore bounds the month by length: 01-12 or 51-62 for 9 digits (year 00-53), 01-12, 21-32, 51-62 or 71-82 for 10 digits. Divisibility by 11 of the 10-digit numbers is the key: it is checked in code (see the limits). The three real attempts I read bound neither month, day nor length by year.
/^(?:(?:[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})$/passes 25/25 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
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);Limits
- 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.