Regex numéro Aadhaar indien
Un numéro Aadhaar a 12 chiffres, écrits en général en trois groupes de 4 séparés par des espaces (« 2341 2341 2346 »). Le dernier chiffre est une clé calculée par l'algorithme de Verhoeff. Le document de conception de l'UIDAI de 2010 (une proposition, pas un texte réglementaire) réserve le premier chiffre 0 à une extension future et 1 aux entités, et prévoit les numéros de 2 à 9 pour les personnes ; python-stdnum applique la même borne. Parmi les motifs relus ici, validator.js accepte encore un « 1 » en tête, django-localflavor accepte aussi le 0 et le tiret, et les deux motifs de Presidio, conçus pour détecter, ne sont pas ancrés. Voici un motif qui borne le premier chiffre et impose un séparateur identique entre les groupes, comparé à ces tentatives.
/^[2-9][0-9]{3}( ?)[0-9]{4}\1[0-9]{4}$/Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js isIdentityCard('IN') — ancrée, mais « [1-9] » laisse passer un 1 en tête (« 123412341234 ») et chaque « \s? » est indépendant : « 2341 23412346 » passe | ^[1-9]\d{3}\s?\d{4}\s?\d{4}$ | 21 / 23 | sûr |
| django-localflavor (in_/forms.py) — accepte 0 ou 1 en tête, le tiret et des séparateurs mixtes (« 2341-2341 2346 ») ; groupes nommés convertis en syntaxe JS | ^(?<part1>\d{4})[-\ ]?(?<part2>\d{4})[-\ ]?(?<part3>\d{4})$ | 19 / 23 | sûr |
| Presidio, motif « AADHAAR (Very Weak) » — détection non ancrée par \b : « id=234123412346; » et « 123412341234 » passent, la forme avec espaces est refusée | \b[0-9]{12}\b | 16 / 23 | sûr |
| Presidio, motif « AADHAR (Very Weak) » — séparateur « [- :] » (deux-points accepté), 1 en tête accepté, non ancré | \b[0-9]{4}[- :][0-9]{4}[- :][0-9]{4}\b | 15 / 23 | sûr |
| python-stdnum (in_/aadhaar.py) — borne 2-9 correcte, mais appliquée après nettoyage des séparateurs : le motif seul refuse « 2341 2341 2346 » | ^[2-9][0-9]{11}$ | 20 / 23 | sûr |
Implémentation
const re = new RegExp("^[2-9][0-9]{3}( ?)[0-9]{4}\\1[0-9]{4}$", "");
re.test(input);Limites
- Valide seulement la FORME : ne calcule pas la clé Verhoeff. « 234123412347 » a la bonne forme mais une clé fausse et passe ce motif ; le test Verhoeff se fait dans le code, pas dans une regex.
- La borne « premier chiffre de 2 à 9 » vient d'un document de conception de l'UIDAI (2010) et de python-stdnum, pas d'un texte réglementaire que j'ai pu ouvrir. Les numéros palindromes (« 222222222222 »), que python-stdnum rejette, passent aussi.
- Seul l'espace sert de séparateur (celui de l'écriture habituelle par groupes de 4) : le tiret accepté par django-localflavor et le deux-points de Presidio sont refusés ; normalisez avant validation.
- N'établit pas qu'un numéro a été attribué. Le numéro est une donnée personnelle sensible en Inde : n'utilisez dans vos tests que des numéros synthétiques à clé valide comme ceux du corpus.