Regex PESEL polonais
Un PESEL a 11 chiffres : AAMMJJ, 4 chiffres de série et une clé. Subtilité rarement respectée : le mois encode le siècle par un décalage (+80 pour 1800-1899, +20 pour 2000-2099, +40 pour 2100-2199, +60 pour 2200-2299), donc les mois valides sont 01-12, 21-32, 41-52, 61-72 et 81-92. La bibliothèque PII de Microsoft Presidio a la bonne alternance mais n'ancre pas le motif, donc un numéro à 12 ou 13 chiffres qui contient un PESEL passe. validator.js se contente de « 10 ou 11 chiffres », mois 13 compris. Voici un motif ancré qui borne le mois selon le siècle et le jour de 01 à 31, comparé à ces tentatives.
/^[0-9]{2}(?:[02468][1-9]|[13579][012])(?:0[1-9]|[12][0-9]|3[01])[0-9]{5}$/passe 24/24 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Microsoft Presidio — la bonne alternance de mois (01-12, 21-32, 41-52, 61-72, 81-92) mais non ancrée : « 020708036285 » (12 chiffres) et « 1202070803628 » passent ; la clé est vérifiée dans le code | [0-9]{2}([02468][1-9]|[13579][012])(0[1-9]|1[0-9]|2[0-9]|3[01])[0-9]{5} | 22 / 24 | sûr |
| validator.js (pl-PL, partagée avec le NIP) — 10 ou 11 chiffres sans contrainte de date : mois 00, 13, 33, 53 ou 93 et jour 00 ou 32 passent, ainsi qu'un NIP à 10 chiffres | ^\d{10,11}$ | 17 / 24 | sûr |
| euredact (détecteur de données personnelles) — « \b\d{11}\b », conçue pour repérer un numéro dans un texte, pas pour valider : tout numéro à 11 chiffres passe, aucune contrainte de date | \b\d{11}\b | 18 / 24 | sûr |
Implémentation
const re = new RegExp("^[0-9]{2}(?:[02468][1-9]|[13579][012])(?:0[1-9]|[12][0-9]|3[01])[0-9]{5}$", "");
re.test(input);Limites
- Valide seulement la FORME : ne calcule pas la clé (poids 1-3-7-9). « 44051401358 » et « 02070803629 » ont la bonne forme mais une clé fausse, et passent ce motif. Ne valide pas non plus le jour dans le mois : « 02223013623 » (30 février 2002) passe, tout comme un 29 février d'une année non bissextile.
- Ne vérifie pas la cohérence du sexe (le dernier chiffre de la série est pair pour une femme, impair pour un homme) ni l'existence réelle du numéro : seul le registre PESEL le confirme. N'utilisez jamais de vrais PESEL dans vos tests ; les exemples ici viennent de documents officiels et de suites de tests.
- À cause du décalage de siècle, tester simplement « mois ≤ 12 » rejetterait tous les PESEL des personnes nées depuis 2000 (mois 21 à 32). Ce motif accepte ces mois, ainsi que ceux des siècles 1800, 2100 et 2200.
- Accepte 11 chiffres collés, sans espace ni tiret : « 02 070 803628 » est rejeté, normalisez la saisie avant validation.