Rexact
Cheatsheet

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]$/i
passe 20/20 cas

Comparatif des patterns existants

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.