Rexact
Cheatsheet

Regex Italian Codice Fiscale

A Codice Fiscale isn't just "16 characters": only certain letters are valid in the "month" position (A, B, C, D, E, H, L, M, P, R, S, T), a constraint a regex republished on regexpattern.com completely ignores. A 3-vote Stack Overflow answer does better on that specific point, but keeps an "11 digits" alternative inherited from old numeric company codes - a real source of false positives today. A GitHub gist goes much further in structural rigor, but its own author admits it checks neither the municipality code nor the check character. Here's a pattern that at least respects valid month letters, compared against these three attempts.

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

Comparison of existing patterns

SourcepatternScore on the 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 / 20safe
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 / 20safe
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 / 20safe

Implementation

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

Limits

  • 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.