Regex Spanish VAT number (NIF, CIF, NIE)
The Spanish VAT number is the taxpayer's NIF preceded by 'ES': 9 characters where the first, the last, or both are letters. The Commission's VIES FAQ describes it as: 'the first and last characters may be alpha or numeric, but they may not both be numeric'. In practice a company has a CIF (letter, 7 digits, a digit or letter check), an individual a DNI (8 digits and a letter) or a NIE (X, Y or Z, 7 digits, a letter). The attempts read disagree: the published validator.js version rejects CIFs with a digit check and accepts '_' in front, its development version rejects individuals, valvat and jsvat accept any leading letter (I and O included), and the Regular Expressions Cookbook's regex accepts nine digits. Here's a pattern following the Commission's rule and excluding the letters I, O and T up front, compared against those attempts.
/^ES(?:[0-9]{8}[A-Z]|[A-HJ-NP-SU-Z][0-9]{7}[0-9A-Z])$/Comparison of existing patterns
Implementation
const re = new RegExp("^ES(?:[0-9]{8}[A-Z]|[A-HJ-NP-SU-Z][0-9]{7}[0-9A-Z])$", "");
re.test(input);Limits
- Valide seulement la FORME : « ESB64717839 » et « ES12345678A » ont la bonne structure mais une clé fausse (lettre DNI modulo 23, clé CIF de type Luhn) et passent ce motif. La clé n'est pas recalculée.
- Le motif accepte une clé lettre ou chiffre pour toute forme juridique, car python-stdnum signale des informations contradictoires selon la forme ; validator.js (version de développement) impose au contraire un type de clé par lettre initiale.
- Les lettres initiales exclues (I, O, T) viennent de python-stdnum, pas de la FAQ de la Commission. Les formes K, L, M (personnes sans NIE) et X, Y, Z (NIE) sont acceptées : voir dni-nie-espagnol pour les identifiants de personnes physiques.
- Aucune vérification d'existence (VIES). Pas de tolérance pour espaces, tirets ou minuscules : normalisez avant validation. Les numéros du corpus sont des exemples de documentation ou synthétiques.