Regex EGN bulgare (numéro civil unique)
L'EGN a 10 chiffres : l'année sur 2 chiffres, le mois, le jour, 3 chiffres de série dont la parité indique le sexe, et une clé modulo 11. Le siècle est codé dans le mois : 01-12 pour les naissances de 1900 à 1999, 21-32 pour avant 1900 (+20) et 41-52 pour après 1999 (+40) (spécification DG TAXUD). Les trois tentatives réelles relues acceptent « 10 chiffres » sans contrôle de date : « 9913999999 » (mois 13, jour 99) y passe. Voici un motif qui borne le mois codé et le jour, comparé à ces tentatives. La clé (poids 2, 4, 8, 5, 10, 9, 7, 3, 6, modulo 11) et la date réelle sont à vérifier par du code.
/^\d{2}(?:0[1-9]|1[0-2]|2[1-9]|3[0-2]|4[1-9]|5[0-2])(?:0[1-9]|[12]\d|3[01])\d{4}$/passe 25/25 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js isTaxID (bg-BG) — ancrée mais « \d{10} » seulement : « 9913999999 » (mois 13, jour 99) passe | ^\d{10}$ | 18 / 25 | sûr |
| piigex (détecteur bg_egn) — lookarounds seulement, sans borne de date : « x-7501010010 » passe, ainsi que « 0000000000 » | (?<!\d)\d{10}(?!\d) | 17 / 25 | sûr |
| OpenRedaction (BULGARIAN_PERSONAL_NUMBER, regex de détection) — \b…\b non ancré, 10 chiffres quelconques : « EGN 7501010010 » passe ; la date est vérifiée dans un validateur à part | \b(\d{10})\b | 17 / 25 | sûr |
Implémentation
const re = new RegExp("^\\d{2}(?:0[1-9]|1[0-2]|2[1-9]|3[0-2]|4[1-9]|5[0-2])(?:0[1-9]|[12]\\d|3[01])\\d{4}$", "");
re.test(input);Limites
- Valide la forme (mois codé 01-12, 21-32, 41-52, jour 01-31) mais PAS la clé : « 7501010011 » passe. Complément : clé = (Σ chiffre[i] × poids[i] pour les 9 premiers, poids 2, 4, 8, 5, 10, 9, 7, 3, 6) % 11, ramené à 0 si 10.
- Le jour 31 est accepté pour tous les mois (« 9904311… » = 31 avril passe) et la date n'est pas confrontée à aujourd'hui : l'EGN d'un enfant « né en 2099 » est accepté. Calculez la date réelle à partir du mois codé pour la contrôler.
- Le siècle est ambigu sans le mois codé : le motif accepte l'ensemble 1800-2099. Aucune vérification d'attribution ; l'EGN est une donnée personnelle, n'utilisez que l'exemple officiel ou des numéros synthétiques à date future.