Rexact
Cheatsheet

Regex Codice Fiscale italien

Un Codice Fiscale, ce n'est pas juste « 16 caractères » : seules certaines lettres sont valides en position « mois » (A, B, C, D, E, H, L, M, P, R, S, T), une contrainte qu'une regex republiée sur regexpattern.com ignore complètement. Une réponse Stack Overflow à 3 votes fait mieux sur ce point précis, mais conserve une alternative « 11 chiffres » héritée des anciens codes numériques d'entreprise — une source réelle de faux positifs aujourd'hui. Un gist GitHub va bien plus loin dans la rigueur structurelle, mais son propre auteur reconnaît qu'il ne vérifie ni le code de commune ni le caractère de contrôle. Voici un motif qui respecte au moins les lettres de mois valides, comparé à ces trois tentatives.

/^[A-Z]{6}[0-9]{2}[ABCDEHLMPRST][0-9]{2}[A-Z][0-9]{3}[A-Z]$/
passe 20/20 cas

Comparatif des patterns existants

SourcepatternScore sur le corpusReDoS
regexpattern.com — purement structurel, accepte n'importe quelle lettre en position « mois » au lieu des 12 valides, ne vérifie jamais le caractère de contrôle^[A-Za-z]{6}[0-9]{2}[A-Za-z]{1}[0-9]{2}[A-Za-z]{1}[0-9]{3}[A-Za-z]{1}$18 / 20sûr
Stack Overflow (3 votes) — restreint bien les lettres de mois valides, mais conserve une alternative « 11 chiffres » héritée des anciens codes numériques d'entreprise, source réelle de faux positifs^([A-Z]{6}[0-9LMNPQRSTUV]{2}[ABCDEHLMPRST]{1}[0-9LMNPQRSTUV]{2}[A-Z]{1}[0-9LMNPQRSTUV]{3}[A-Z]{1})$|([0-9]{11})$18 / 20sûr
Gist GitHub (matpag) — la tentative en pure regex la plus rigoureuse trouvée, mais l'auteur reconnaît lui-même qu'elle ne vérifie ni le code de commune réel ni le caractère de contrôle^(?:[A-Z][AEIOUX][AEIOUX]|[AEIOU]X{2}|[B-DF-HJ-NP-TV-Z]{2}[A-Z]){2}(?:[\dLMNP-V]{2}(?:[A-EHLMPR-T](?:[04LQ][1-9MNP-V]|[15MR][\dLMNP-V]|[26NS][0-8LMNP-U])|[DHPS][37PT][0L]|[ACELMRT][37PT][01LM]|[AC-EHLMPR-T][26NS][9V])|(?:[02468LNQSU][048LQU]|[13579MPRTV][26NS])B[26NS][9V])(?:[A-MZ][1-9MNP-V][\dLMNP-V]{2}|[A-M][0L](?:[1-9MNP-V][\dLMNP-V]|[0L][1-9MNP-V]))[A-Z]$19 / 20sûr

Implémentation

const re = new RegExp("^[A-Z]{6}[0-9]{2}[ABCDEHLMPRST][0-9]{2}[A-Z][0-9]{3}[A-Z]$", "");
re.test(input);

Limites

  • Valide seulement la FORME (lettres de mois autorisées, structure générale) : ne calcule pas le caractère de contrôle (somme pondérée alternée modulo 26) — un code syntaxiquement valide selon ce motif peut avoir un caractère de contrôle faux et ne correspondre à aucune personne réellement enregistrée (voir RSSMRA85C15H501S dans les exemples, structure correcte mais clé fausse).
  • N'impose aucune contrainte sur le code de commune (les 4 derniers caractères hors caractère de contrôle) : une lettre suivie de 3 chiffres qui ne correspond à aucune commune ou pays réel passe ce motif tout aussi facilement qu'un code réel.
  • Ne consulte pas le registre de l'Agenzia delle Entrate : seule une vérification auprès de cette administration confirme qu'un Codice Fiscale est réellement attribué à une personne.
  • Ne gère pas les caractères de substitution utilisés en cas d'homonymie (« omocodia », où certains chiffres sont remplacés par des lettres pour différencier deux personnes ayant le même code) : ce motif n'accepte que la forme numérique standard, pas ces variantes.