Test e QA · 6 min di lettura

Formato dei codici postali per paese: riferimento regex 2026

Formati dei codici postali per 38 paesi con regex funzionanti: sistemi numerici e alfanumerici, paesi senza codice postale, regole di normalizzazione e un corpus di test.

Di Charlie Simmon ·

I formati dei codici postali non sono intercambiabili, e un validatore che presuppone cinque cifre rifiuterà la maggior parte del mondo. Le differenze sono strutturali, non estetiche: alcuni sistemi sono numerici con zeri iniziali, altri mescolano lettere e cifre, alcuni collocano il codice prima della città, e due paesi nel set di fixture di questo sito non hanno alcun codice postale.

Questo riferimento raccoglie i pattern che contano per uno sviluppatore che costruisce un modulo di indirizzo, con regex testabili direttamente. Traccia anche il confine che il sito stesso traccia: la validazione postale qui è un controllo di struttura per ogni paese, più un controllo di esistenza per gli ZIP statunitensi su un dataset di 40.979 righe. Nulla in questa guida implica che un codice corrispondente sia assegnato o consegnabile.

Perché i codici postali non sono un campo numerico

Gli Stati Uniti usano cinque cifre o ZIP+4, il che tenta gli sviluppatori a modellare i codici postali come interi. Quel modello si rompe immediatamente in Canada, Regno Unito, Paesi Bassi, Irlanda, Malta e Argentina, dove le lettere fanno parte del codice. Si rompe anche silenziosamente in Germania, Francia, Spagna, Italia e Polonia, dove gli zeri iniziali sono significativi e una colonna intera li elimina.

Una seconda classe di bug deriva dalla posizione. La maggior parte dei paesi occidentali mette il codice postale dopo la città, ma Germania, Francia, Paesi Bassi e Giappone lo collocano prima della città, e il Giappone mette l'intero codice all'inizio assoluto dell'indirizzo. Se il tuo modulo genera un template fisso, produrrà indirizzi che un lettore locale trova palesemente sbagliati anche se ogni campo è compilato.

  • Memorizza sempre i codici postali come testo, mai come interi
  • Mantieni intatti gli zeri iniziali attraverso ogni livello, inclusa l'esportazione CSV
  • Consenti le lettere a meno che il paese non sia strettamente numerico
  • Non dare per scontato che il codice postale segua la città
  • Tratta il separatore come presentazione, non come struttura

Sistemi numerici e loro intervalli

La maggior parte dell'Europa usa codici numerici a lunghezza fissa. Germania, Francia, Spagna, Italia, Grecia, Turchia e Arabia Saudita usano cinque cifre; Austria, Belgio, Svizzera, Danimarca, Norvegia, Ungheria e Sudafrica ne usano quattro; Polonia e Portogallo aggiungono un trattino; la Svezia usa tre cifre, uno spazio e due. La Cechia usa cinque cifre tipicamente scritte con uno spazio dopo la terza.

Asia e America Latina sono per lo più numeriche ma con lunghezze diverse. India, Cina, Russia, Singapore e Nigeria usano sei cifre; il Giappone ne usa sette con un trattino convenzionale dopo la terza; la Corea del Sud ne usa cinque; il Brasile ne usa otto con un trattino dopo la quinta; il Cile ne usa sette; la Colombia ne usa sei; Perù e Messico ne usano cinque. La sola lunghezza non basta a identificare un paese, ed è per questo che un validatore ha bisogno del campo paese prima di validare qualsiasi cosa.

PaeseLunghezzaForma canonicaRegex
Germania5 cifre10115^\d{5}$
Francia5 cifre75008^\d{5}$
Spagna5 cifre28013^\d{5}$
Austria4 cifre1010^\d{4}$
Polonia5 cifre con trattino00-001^\d{2}-\d{3}$
Portogallo7 cifre con trattino1250-096^\d{4}-\d{3}$
Svezia5 cifre con spazio114 55^\d{3}\s\d{2}$
Giappone7 cifre con trattino100-0001^\d{3}-\d{4}$
Brasile8 cifre con trattino01310-100^\d{5}-\d{3}$
India6 cifre110001^\d{6}$
Corea del Sud5 cifre04524^\d{5}$
Messico5 cifre06600^\d{5}$

Sistemi alfanumerici e regole sui caratteri

Il Canada usa il pattern A1A 1A1, e le lettere sono limitate. Il primo carattere non può essere D, F, I, O, Q, U, W o Z, e le lettere rimanenti non possono essere D, F, I, O, Q o U. Lo spazio tra i due gruppi è convenzionale. Un validatore che consente qualsiasi lettera accetterà codici che Canada Post non emette mai.

Il Regno Unito usa un codice esterno di due-quattro caratteri seguito da un singolo spazio e un codice interno di tre caratteri, come in SW1A 1AA. I Paesi Bassi sono quattro cifre, uno spazio e due lettere maiuscole. L'Irlanda usa un Eircode di sette caratteri diviso in una routing key di tre caratteri e un identificatore univoco di quattro caratteri. Malta è tre lettere, uno spazio e quattro cifre. L'Argentina usa il CPA di otto caratteri, una lettera seguita da quattro cifre e tre lettere, per esempio C1425ABC.

PaesePatternEsempioRegex
CanadaA1A 1A1 con lettere limitateK1A 0B1^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] ?\d[ABCEGHJKLMNPRSTVWXYZ]\d$
Regno Unito2-4 caratteri esterni, 3 interniSW1A 1AA^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$
Paesi Bassi4 cifre, 2 lettere1012 AB^\d{4} ?[A-Z]{2}$
Irlandarouting key di 3 caratteri, identificatore di 4D02 X285^(?:[A-Z]\d{2}|D6W) ?[A-Z0-9]{4}$
Malta3 lettere, 4 cifreVLT 1117^[A-Z]{3} ?\d{4}$
ArgentinaLettera, 4 cifre, 3 lettereC1425ABC^[A-Z]\d{4}[A-Z]{3}$

Paesi senza codice postale

Hong Kong e gli Emirati Arabi Uniti non hanno un sistema di codici postali. Entrambi sono nel set di fixture di 38 paesi di questo sito, e il generatore restituisce un valore postale vuoto per loro invece di inventare cifre. Questo è il comportamento corretto ed è anche un caso di test utile, perché un modulo che contrassegna il codice postale come obbligatorio è rotto per entrambi i mercati.

La convenzione negli Emirati è un numero di casella postale, che non è un codice postale e non dovrebbe essere forzato in quel campo. Gli indirizzi di Hong Kong usano il distretto e la via, e la posta viene consegnata senza alcun codice. Se il tuo modello dati richiede un valore postale non nullo, usa un sentinella esplicito come un flag a livello di paese, non un codice falso, perché un codice falso supererà la validazione e poi fallirà ogni controllo a valle che presuppone un codice reale.

  • Hong Kong: nessun codice postale, distretto più via è l'indirizzo
  • Emirati Arabi Uniti: nessun codice postale, la casella postale è la convenzione comune
  • Rendi il campo postale opzionale quando è selezionato uno dei due paesi
  • Non sostituire mai 00000 o N/A in una colonna postale
  • Registra l'assenza esplicitamente così le esportazioni non sembrano dati mancanti

Controlli di struttura versus controlli di esistenza

Un controllo di struttura risponde se una stringa corrisponde al pattern del paese. Un controllo di esistenza risponde se il codice appare in un dataset di riferimento. Solo il secondo può dirti che un codice non è mai stato assegnato. Questo sito esegue il controllo di struttura per tutti i 38 paesi e un controllo di esistenza per gli ZIP statunitensi su 40.979 righe, e li etichetta diversamente così nessuno li confonde.

Nessuno dei due controlli prova la consegnabilità. Uno ZIP statunitense di cinque cifre può esistere mentre l'indirizzo stradale sotto di esso no, e un codice tedesco strutturalmente valido può appartenere a una città diversa da quella fornita. Se hai bisogno di quel livello di garanzia, ti serve un dataset di riferimento postale e un database a livello di strada, che è un prodotto diverso da un controllo di formato.

Tipo di controlloCopreProvaNon prova
Corrispondenza patternTutti i 38 paesiBen formato per quel paeseChe il codice sia assegnato
Esistenza ZIP USA40.979 righe ZIP USAIl codice è nel datasetAccordo di città o via
Regola campo obbligatorioLivello moduloL'invio può procedereQualsiasi validità nel mondo reale
Lunghezza e charsetLivello campoL'archiviazione non andrà in overflowCorrettezza del paese

Dettagli regex che causano bug in produzione

Ancora ogni pattern. Un /\d{5}/ non ancorato corrisponde alle cinque cifre dentro una stringa di nove cifre e riporta successo. Usa ^ e $, o l'API equivalente di corrispondenza completa. In JavaScript, \d corrisponde solo alle cifre ASCII; in Python, \d corrisponde per impostazione predefinita alle cifre Unicode, quindi un pattern può accettare numeri arabi orientali a meno che tu non compili con re.ASCII o scriva [0-9].

Decidi esplicitamente se il separatore è obbligatorio. Per la visualizzazione, inserisci tu stesso il separatore canonico. Per l'input, accetta zero o uno spazio o trattino e normalizza. Fai attenzione ai trattini all'interno delle classi di caratteri, dove definiscono intervalli a meno che non siano escapati o posizionati per ultimi. E non usare un flag case-insensitive per coprire un bug di normalizzazione: converti in maiuscolo al momento della scrittura e mantieni la forma di visualizzazione canonica.

  • Ancora con ^ e $, o usa una funzione di corrispondenza completa
  • Usa [0-9] quando intendi cifre ASCII
  • Accetta separatori opzionali in input, emetti separatori canonici in visualizzazione
  • Escapa i trattini o posizionali per ultimi dentro una classe di caratteri
  • Converti in maiuscolo prima della corrispondenza invece di spargere flag di case
  • Rifiuta esplicitamente spazi non separabili e caratteri a larghezza zero

Normalizza in scrittura, formatta in visualizzazione

Memorizza una forma canonica e deriva la forma di visualizzazione. La forma canonica è di solito maiuscola con il separatore standard, o solo cifre quando il separatore è puramente convenzionale. Conserva l'input grezzo dell'utente in una colonna separata se hai bisogno di una traccia di controllo, perché la normalizzazione è lossy e un agente di supporto potrebbe aver bisogno di vedere esattamente cosa è stato digitato.

La normalizzazione specifica per paese è piccola ma reale. Il Canada vuole lettera-cifra-lettera maiuscola, spazio, cifra-lettera-cifra. I Paesi Bassi vogliono lettere maiuscole dopo le cifre. Il Regno Unito vuole un singolo spazio e maiuscole. Brasile e Giappone usano un trattino che gli utenti spesso omettono, quindi normalizza alla forma con trattino. La Germania non vuole alcun separatore e deve mantenere lo zero iniziale.

PaeseInput grezzoCanonico memorizzatoVisualizzazione
Canadak1a0b1K1A 0B1K1A 0B1
Paesi Bassi1012ab1012 AB1012 AB
Regno Unitosw1a1aaSW1A 1AASW1A 1AA
Brasile0131010001310-10001310-100
Giappone1000001100-0001100-0001
Germania101151011510115
Svezia11455114 55114 55

Un corpus di test che puoi copiare

Ogni validatore ha bisogno di un corpus con almeno un caso valido e uno non valido per paese, più casi che testano specificamente la normalizzazione e l'archiviazione. La tabella seguente è un set iniziale. Nota che diversi casi non validi sono non validi per ragioni specifiche del paese anziché generiche, ed è qui che la maggior parte dei test scritti a mano si ferma troppo presto.

Aggiungi casi per i paesi senza codice postale, per gli zeri iniziali e per le varianti di separatore che gli utenti digitano davvero. Se il validatore è condiviso tra client e server, esegui lo stesso corpus contro entrambe le implementazioni; una divergenza tra un client permissivo e un server rigoroso è la fonte più comune di segnalazioni del tipo "il modulo l'ha accettato ma l'API l'ha rifiutato".

CasoValorePaeseAtteso
ZIP+4 valido97205-2515Stati UnitiAccetta
ZIP+4 non valido97205-251Stati UnitiRifiuta
Canadese validoK1A 0B1CanadaAccetta
Lettera canadese errataD1A 0B1CanadaRifiuta
UK validoSW1A 1AARegno UnitoAccetta
UK interno mancanteSW1ARegno UnitoRifiuta
Zero iniziale tedesco01067GermaniaAccetta e preserva
Lettere in un sistema numerico1011AGermaniaRifiuta
Nessun codiceHong KongAccetta come vuoto
Codice inventato99999Emirati Arabi UnitiRifiuta il campo

Domande

Quali paesi non hanno codici postali?+
Hong Kong e gli Emirati Arabi Uniti non ne hanno, ed entrambi sono nel set di fixture di 38 paesi di questo sito. Il generatore restituisce un campo postale vuoto per loro invece di inventare un valore.
Un codice postale valido significa che l'indirizzo è reale?+
No. Una corrispondenza strutturale significa solo che il valore è ben formato. Solo gli ZIP statunitensi ricevono qui un controllo di esistenza, su 40.979 righe, e nessun paese riceve una dichiarazione di consegnabilità.
I codici postali dovrebbero essere memorizzati come interi?+
Mai. Canada, Regno Unito, Paesi Bassi, Irlanda, Malta e Argentina usano lettere, e Germania, Francia, Spagna, Italia e Polonia hanno zeri iniziali significativi.
Perché i Paesi Bassi mettono le lettere dopo le cifre?+
Il codice olandese è quattro cifre seguite da due lettere maiuscole, per esempio 1012 AB. Le lettere fanno parte del codice, non sono un suffisso di regione, e una regex di sole cifre rifiuta indirizzi validi.
Come dovrei gestire lo spazio in un codice britannico o canadese?+
Accetta input con zero o uno spazio, converti in maiuscolo e memorizza un singolo separatore canonico. Emetti la forma canonica per la visualizzazione invece di ripetere ciò che l'utente ha digitato.

Gli esempi sono sintetici. Non usare un indirizzo generato per verifiche di identità, registrazione di account o consegne.

Standard di riferimento

Leggi dopo

Tutte le guide