Regex DNI/NIE espagnol
Un DNI, ce n'est pas juste « 8 chiffres + une lettre » : la lettre de contrôle vient d'une table fixe de 23 lettres (I, O, U sont délibérément exclues pour éviter la confusion avec 1, 0, U), calculée par un modulo 23 sur les 8 chiffres. Une regex sur RegexTester accepte pourtant n'importe quelle lettre A-Z, I/O/U compris. La meilleure réponse trouvée, à 32 votes sur Stack Overflow en español, restreint bien aux 23 lettres valides — mais son propre auteur le précise noir sur blanc : « Pero eso es para comprobar el formato » (mais ça, c'est pour vérifier le format). Aucune regex seule ne peut vérifier le calcul modulo 23 lui-même. Voici un motif qui respecte au moins la bonne table de lettres, comparé à ces trois tentatives.
/^(?:[0-9]{8}|[XYZ][0-9]{7})[TRWAGMYFPDXBNJZSQVHLCKE]$/ipasse 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| RegexTester — accepte n'importe quelle lettre A-Z, y compris I/O/U qui ne sont jamais des lettres de contrôle valides, sans jamais vérifier le calcul | ^[0-9]{8,8}[A-Za-z]$ | 16 / 20 | sûr |
| Gist GitHub (afgomez) — le NIE autorise à tort 7 OU 8 chiffres (toujours 7 en réalité), le DNI accepte n'importe quelle lettre au lieu des 23 valides | ^[XYZ]\d{7,8}[A-Z]$ | 16 / 20 | sûr |
| Stack Overflow en español (32 votes) — restreint correctement aux 23 lettres valides, mais l'auteur précise lui-même que ça ne vérifie que le FORMAT : un DNI 12345678A passe cette regex alors que la lettre correcte est Z | ^[XYZ][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]$ | 17 / 20 | sûr |
Implémentation
const re = new RegExp("^(?:[0-9]{8}|[XYZ][0-9]{7})[TRWAGMYFPDXBNJZSQVHLCKE]$", "i");
re.test(input);Limites
- Valide seulement la FORME (8 chiffres ou X/Y/Z + 7 chiffres, lettre parmi les 23 valides) : ne calcule pas le modulo 23 lui-même — un DNI syntaxiquement valide selon ce motif peut avoir une lettre fausse par rapport à son numéro (voir 12345678A dans les exemples, structure correcte mais lettre fausse : la bonne serait Z).
- Ne consulte aucun registre du Ministerio del Interior : seule une vérification administrative confirme qu'un DNI/NIE est réellement attribué à une personne.
- Ne distingue pas dans son résultat le DNI (citoyens espagnols) du NIE (résidents étrangers) : les deux partagent la même famille de format, seule la présence d'un préfixe X/Y/Z les différencie.
- N'accepte que la forme sans séparateur : la présentation parfois utilisée à l'affichage avec un tiret avant la lettre (« 12345678-Z ») doit être retirée avant validation par ce motif.