Regex Italian VAT number (partita IVA)
The Italian partita IVA has 11 digits: a 7-digit serial, a 3-digit code of the office (ufficio) that issued the number, then a Luhn-type check digit defined by the ministerial decree of 23 December 1976. The office code matches a province: 001 to 100, 120 and 121, plus 888 (franchise regime) and 999 (non-residents identified in Italy). The Commission's VIES FAQ only publishes 'IT + 11 digits', and the three VAT implementations read (validator.js, jsvat, valvat) check only that, like the Regular Expressions Cookbook's single regex: an office code 000 or 889 slips through. Here's a pattern bounding the office code and rejecting an all-zero serial, compared against those attempts.
/^IT(?!0{7})[0-9]{7}(?:00[1-9]|0[1-9][0-9]|100|12[01]|888|999)[0-9]$/passes 29/29 cases
Comparison of existing patterns
Implementation
const re = new RegExp("^IT(?!0{7})[0-9]{7}(?:00[1-9]|0[1-9][0-9]|100|12[01]|888|999)[0-9]$", "");
re.test(input);Limits
- Valide seulement la FORME : « IT12345670018 » a un code d'ufficio valide mais une clé Luhn fausse et passe ce motif. La clé (décret du 23 décembre 1976) n'est pas recalculée par la regex.
- La liste des codes d'ufficio (001-100, 120, 121, 888, 999) vient de it.wikipedia et de python-stdnum ; jsvat tolère jusqu'à 201. Si l'administration ajoutait un code, ce motif le refuserait : à relire régulièrement.
- Le code fiscal d'une personne physique (16 caractères) n'est pas une partita IVA, et un code fiscal de société peut ressembler à une partita IVA : voir la fiche codice-fiscale. Aucune vérification d'existence (VIES).
- Pas de tolérance pour les espaces ou minuscules ; normalisez avant validation. Les numéros du corpus sont des exemples de documentation ou synthétiques.