Il Codice Fiscale, spesso verificato in modo non corretto e superficiale, è un po’ la chimera dei sistemi di validazione, ma fruendo correttamente dei documenti ufficiali forniti dall’amministrazione pubblica verrà mostrato come ottenere l’espressione regolare definitiva in grado di analizzare e validare correttamente qualsiasi Codice Fiscale rilasciato dall’Agenzia delle Entrate.

NUOVA VERSIONE 2019: Controllo anni bisestili

Prova la nuova libreria JavaScript su npm, ancora più avanzata e precisa, con controllo della data e del luogo di nascita.

Se hai fretta, l’espressione regolare finale e completa è riportata in coda all’articolo, altrimenti puoi leggere passo passo come è stata realizzata

Documentazione di riferimento

Di seguito i link alla documentazione ufficiale, del sito dell’Agenzia delle Entrate, utilizzata per realizzare le regole di validazione per il codice fiscale

Per la realizzazione di un’espressione regolare di validazione del Codice Fiscale corretta e conforme,  seguiremo passo passo le indicazioni riportate nei documenti consultabil nei link

Numero di codice fiscale delle persone fisiche

  • Primi tre caratteri del codice fiscale: alfabetici per il cognome: [A-Z]{3}
  • Dal quarto al sesto carattere del codice fiscale: alfabetici per il nome: [A-Z]{3}
  • Settimo ed ottavo carattere del codice fiscale: numerici per l’anno di nascita: \d{2}
  • Nono carattere del codice fiscale: alfabetico per il mese di nascita: [A-Z]
  • Decimo carattere del codice fiscale: numerico per il sesso: \d
  • Decimo ed undicesimo carattere del codice fiscale: numerici per il giorno di nascita: \d{2}
  • Dal dodicesimo al quindicesimo carattere del codice fiscale: uno alfabetico e tre numerici per il comune italiano o per lo Stato estero di nascita: [A-Z]\d{3}
  • Sedicesimo carattere del codice fiscale: alfabetico con funzione di controllo: [A-Z]

La RegEx sarà dunque:

Ma è ancora troppo generica e non ricopre tutte le casistiche

Caratteri indicativi del nome e del cognome

Dal 1° al 6° carattere

Analizzando il testo e considerando che cognome e nome possono essere analizzati con la stessa espressione regolare, possiamo considerare le seguenti casistiche:

  • Tre consonanti:  [B-DF-HJ-NP-TV-Z]{3}
  • Due consonanti e una vocale:  [B-DF-HJ-NP-TV-Z]{2}[AEIOU]
  • Una consonante e due vocali: [B-DF-HJ-NP-TV-Z][AEIOU]{2}
  • Una Consonante ed una vocale:  [B-DF-HJ-NP-TV-Z][AEIOU]X
  • Tre vocali: [AEIOU]{3}
  • Due vocali: [AEIOU]{2}X

La RegEx parziale, considerando tutte le casistiche sarà:

Data di nascita e sesso

Dal 7° all’ 11° carattere
  • Le prime due cifre rappresentano le ultime due dell’anno: \d{2}
  • Il terzo carattere rappresenta il mese rappresentato da una lettera (vedere la tabella del documento):
  • La quarta e la quinta cifra rappresentano il giorno del mese:
  • Nel caso di persona di sesso femminile al giorno viene addizionato 40:

La RegEx parziale per questo blocco di informazioni sarebbe:

Tale soluzione accetterebbe date inesistenti come il 30 febbraio o il 31 Aprile, quindi considerando il calendario Giuliano*:

  • Febbraio ha 28 giorni:
  • Febbraio ha 29 giorni negli anni bisestili (multipli di 4):
  • Gennaio, Marzo, Maggio, Luglio, Agosto, Ottobre e Dicembre hanno 31 giorni:
  • Aprile, Giugno, Settembre e Novembre hanno 30 giorni:

In considerazione di tali vincoli e le specifiche precedenti, si avrà la seguente espressione regolare parziale:

Luogo di nascita

Dal 12° al 15° carattere

Il codice di quattro cife, o codice Belfiore, rappresentante il comune o lo stato estero di nascita è esaustivamente documentato ai link forniti nella sezione Documentazione di riferimento; in considerazione di quanto indicato:

  • Il primo carattere può essere compreso tra A ed M per i comuni Italiani: [A-M]
  • Le cifre numeriche possono variare da 001 a 999 per i Comuni Italiani:
  • Il primo carattere è Z per gli stati esteri: Z
  • Le cifre numeriche attualmente utilizzate per gli stati esteri vanno da 100 a 999: [1-9]\d{2}

Si avrà quindi la seguente espressione regolare parziale:

Carattere alfabetico di controllo

16° carattere

Tale codice è stabilito tramite una formula troppo complessa per poterne verificare la validità con un’espressione regolare, richiederebbe 25 gruppi di innumerevoli possibilità, per cui verrà applicata una semplice regex per verificare che sia una lettera: [A-Z]

Persone fisiche con identica espressione alfanumerica (omocodia)

7°, 8°, 10°, 11°, 13°,14° e 15° carattere

A discrezione dell’ente una o più delle sette cifre numeriche possono essere sostituite con la relativa lettera indicata nella tabella del documento; di seguito un piccolo riepilogo dei range numerici utilizzati:

  • Tutti gli interi \d: [\dLMNP-V]
  • Tutti gli interi tra 0 ed 8: [0-8LMNP-U]
  • Tutti gli interi tra 1 e 9: [1-9NP-V]
  • Tutti gli interi dispari: [13579MPRTV]
  • Tutti gli interi pari, incluso lo zero: [02468LNQSU]
  • Solo zero: [0L]
  • Solo 9: [9V]
  • Zero e quattro: [04LQ]
  • Zero e uno: [01LM]
  • Uno e cinque: [15MR]
  • Due e sei: [26NS]
  • Tre e sette: [37PT]
  • Zero, quattro, otto: [048LQU]
  • Uno, due, cinque e sei: [1256LMRS]

L’espressione parziale per la data, sesso e comune, comprensiva di casistiche per l’omocodia, risulta la seguente:

RegEx perfetta (omocodici, date e comuni)

La RegEx completa, che verifica anche la validità della data di nascita, la conformità di nome e cognome, la pertinenza del codice del comune o dello stato di nascita, tenendo in considerazione anche delle combinazioni alternative in caso di omocodia è dunque la seguente:

Oltre la perfezione: esistenza del luogo rispetto alla data di nascita e codice di controllo

Per una validazione al massimo della precisione possibile, controllo validità data, esistenza del luogo rispetto alla data di nascita e verifica del codice di controllo, è disponibile la nuova libreria JavaScript su npm che include tutti i comuni italiani e le nazioni straniere con data di fondazione e cessazione, la verifica del codice di controllo, la generazione di espressioni regolari dinamiche per validare campi di input per il codice fiscale / nome, cognome, data, sesso e luogo: codice-fiscale-utils

* Il calendario Giuliano prevedeva che gli anni multipli di 4 fossero bisestili (Febbraio con 29 giorni); il Calendario Gregoriano, attualmente in uso, prevede che gli anni secolari, eccetto quelli multipli di 400, non siano bisestili: purtroppo con solo 2 cifre per indicare l’anno non è possibile effettuare un controllo così accurato, l’espressione regolare si limita ai soli anni multipli di 4.