Postleitzahlenformate sind nicht austauschbar, und ein Validator, der fünf Ziffern annimmt, weist den Großteil der Welt zurück. Die Unterschiede sind struktureller, nicht kosmetischer Natur: Manche Systeme sind numerisch mit führenden Nullen, manche mischen Buchstaben und Ziffern, manche stellen den Code vor die Stadt, und zwei Länder im Fixture-Set dieser Seite haben überhaupt keine Postleitzahlen.
Diese Referenz sammelt die Muster, die für Entwickler beim Bau eines Adressformulars relevant sind, mit Regexes, die Sie direkt testen können. Sie zieht außerdem dieselbe Grenze wie die Seite selbst: Die Postleitzahlenvalidierung hier ist eine Strukturprüfung für jedes Land plus eine Existenzprüfung für US-ZIPs gegen einen Datensatz mit 40.979 Zeilen. Nichts in diesem Leitfaden impliziert, dass ein passender Code vergeben oder zustellbar ist.
Warum Postleitzahlen kein numerisches Feld sind
Die Vereinigten Staaten verwenden fünf Ziffern oder ZIP+4, was Entwickler dazu verleitet, Postleitzahlen als Integer zu modellieren. Dieses Modell bricht sofort in Kanada, dem Vereinigten Königreich, den Niederlanden, Irland, Malta und Argentinien, wo Buchstaben Teil des Codes sind. Es bricht auch still in Deutschland, Frankreich, Spanien, Italien und Polen, wo führende Nullen bedeutsam sind und eine Integer-Spalte sie verwirft.
Eine zweite Fehlerklasse entsteht aus der Position. Die meisten westlichen Länder setzen die Postleitzahl nach die Stadt, aber Deutschland, Frankreich, die Niederlande und Japan setzen sie davor, und Japan stellt den gesamten Code an den Anfang der Adresse. Wenn Ihr Formular eine feste Vorlage rendert, erzeugt es Adressen, die ein lokaler Leser offensichtlich falsch findet, obwohl jedes Feld ausgefüllt ist.
- Postleitzahlen immer als Text speichern, niemals als Integer
- Führende Nullen durch jede Schicht erhalten, einschließlich CSV-Export
- Buchstaben zulassen, außer das Land ist strikt numerisch
- Nicht annehmen, dass die Postleitzahl nach der Stadt kommt
- Das Trennzeichen als Darstellung behandeln, nicht als Struktur
Numerische Systeme und ihre Bereiche
Der Großteil Europas verwendet numerische Codes fester Länge. Deutschland, Frankreich, Spanien, Italien, Griechenland, die Türkei und Saudi-Arabien verwenden fünf Ziffern; Österreich, Belgien, die Schweiz, Dänemark, Norwegen, Ungarn und Südafrika vier; Polen und Portugal fügen einen Bindestrich hinzu; Schweden verwendet drei Ziffern, ein Leerzeichen und zwei. Tschechien ist fünfstellig, üblicherweise mit einem Leerzeichen nach der dritten Ziffer.
Asien und Lateinamerika sind meist numerisch, aber mit unterschiedlichen Längen. Indien, China, Russland, Singapur und Nigeria verwenden sechs Ziffern; Japan sieben mit einem konventionellen Bindestrich nach der dritten; Südkorea fünf; Brasilien acht mit einem Bindestrich nach der fünften; Chile sieben; Kolumbien sechs; Peru und Mexiko fünf. Die Länge allein reicht nicht aus, um ein Land zu identifizieren, weshalb ein Validator das Länderfeld benötigt, bevor er irgendetwas validiert.
| Land | Länge | Kanonische Form | Regex |
|---|---|---|---|
| Deutschland | 5 Ziffern | 10115 | ^\d{5}$ |
| Frankreich | 5 Ziffern | 75008 | ^\d{5}$ |
| Spanien | 5 Ziffern | 28013 | ^\d{5}$ |
| Österreich | 4 Ziffern | 1010 | ^\d{4}$ |
| Polen | 5 Ziffern mit Bindestrich | 00-001 | ^\d{2}-\d{3}$ |
| Portugal | 7 Ziffern mit Bindestrich | 1250-096 | ^\d{4}-\d{3}$ |
| Schweden | 5 Ziffern mit Leerzeichen | 114 55 | ^\d{3}\s\d{2}$ |
| Japan | 7 Ziffern mit Bindestrich | 100-0001 | ^\d{3}-\d{4}$ |
| Brasilien | 8 Ziffern mit Bindestrich | 01310-100 | ^\d{5}-\d{3}$ |
| Indien | 6 Ziffern | 110001 | ^\d{6}$ |
| Südkorea | 5 Ziffern | 04524 | ^\d{5}$ |
| Mexiko | 5 Ziffern | 06600 | ^\d{5}$ |
Alphanumerische Systeme und ihre Zeichenregeln
Kanada verwendet das Muster A1A 1A1, und die Buchstaben sind eingeschränkt. Das erste Zeichen darf nicht D, F, I, O, Q, U, W oder Z sein, und die übrigen Buchstaben dürfen nicht D, F, I, O, Q oder U sein. Das Leerzeichen zwischen den beiden Dreiergruppen ist konventionell. Ein Validator, der jeden Buchstaben zulässt, akzeptiert Codes, die Canada Post nie vergibt.
Das Vereinigte Königreich verwendet einen Outward-Code aus zwei bis vier Zeichen, gefolgt von einem einzelnen Leerzeichen und einem dreizeichigen Inward-Code, wie in SW1A 1AA. Die Niederlande sind vier Ziffern, ein Leerzeichen und zwei Großbuchstaben. Irland verwendet einen siebenstelligen Eircode, aufgeteilt in einen dreizeichigen Routing Key und eine vierstellige eindeutige Kennung. Malta ist drei Buchstaben, ein Leerzeichen und vier Ziffern. Argentinien verwendet den achtstelligen CPA, einen Buchstaben gefolgt von vier Ziffern und drei Buchstaben, zum Beispiel C1425ABC.
| Land | Muster | Beispiel | Regex |
|---|---|---|---|
| Kanada | A1A 1A1 mit eingeschränkten Buchstaben | K1A 0B1 | ^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] ?\d[ABCEGHJKLMNPRSTVWXYZ]\d$ |
| Vereinigtes Königreich | 2-4 Zeichen Outward, 3 Zeichen Inward | SW1A 1AA | ^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$ |
| Niederlande | 4 Ziffern, 2 Buchstaben | 1012 AB | ^\d{4} ?[A-Z]{2}$ |
| Irland | 3 Zeichen Routing Key, 4 Zeichen Kennung | D02 X285 | ^(?:[A-Z]\d{2}|D6W) ?[A-Z0-9]{4}$ |
| Malta | 3 Buchstaben, 4 Ziffern | VLT 1117 | ^[A-Z]{3} ?\d{4}$ |
| Argentinien | Buchstabe, 4 Ziffern, 3 Buchstaben | C1425ABC | ^[A-Z]\d{4}[A-Z]{3}$ |
Länder ohne Postleitzahl
Hongkong und die Vereinigten Arabischen Emirate haben kein Postleitzahlensystem. Beide sind im 38-Länder-Fixture-Set dieser Seite, und der Generator gibt für sie einen leeren Postleitzahlwert zurück, statt Ziffern zu erfinden. Das ist das korrekte Verhalten und zugleich ein nützlicher Testfall, denn ein Formular, das die Postleitzahl als Pflichtfeld markiert, ist für beide Märkte fehlerhaft.
Die VAE-Konvention ist eine P.O.-Box-Nummer, die keine Postleitzahl ist und nicht in dieses Feld gezwungen werden sollte. Hongkonger Adressen verwenden Bezirk und Straße, und Post wird ohne jeglichen Code zugestellt. Wenn Ihr Datenmodell einen nicht-nullbaren Postleitzahlwert erfordert, verwenden Sie einen expliziten Sentinel wie ein Länder-Flag, keinen Fake-Code, denn ein Fake-Code besteht die Validierung und scheitert dann an jeder nachgelagerten Prüfung, die einen echten Code annimmt.
- Hongkong: keine Postleitzahl, Bezirk plus Straße ist die Adresse
- Vereinigte Arabische Emirate: keine Postleitzahl, P.O. Box ist die gängige Konvention
- Das Postleitzahlfeld optional machen, wenn eines der beiden Länder ausgewählt ist
- Niemals 00000 oder N/A in eine Postleitzahlspalte einsetzen
- Die Abwesenheit explizit erfassen, damit Exporte nicht wie fehlende Daten aussehen
Strukturprüfungen versus Existenzprüfungen
Eine Strukturprüfung beantwortet, ob eine Zeichenkette dem Ländermuster entspricht. Eine Existenzprüfung beantwortet, ob der Code in einem Referenzdatensatz vorkommt. Nur die zweite kann Ihnen sagen, dass ein Code nie vergeben wurde. Diese Seite führt die Strukturprüfung für alle 38 Länder und eine Existenzprüfung für US-ZIPs gegen 40.979 Zeilen durch und kennzeichnet sie unterschiedlich, damit niemand das eine mit dem anderen verwechselt.
Keine der beiden Prüfungen beweist Zustellbarkeit. Eine fünfstellige US-ZIP kann existieren, während die Straßenadresse darunter nicht existiert, und ein strukturell gültiger deutscher Code kann zu einer anderen Stadt gehören als der angegebenen. Wenn Sie dieses Maß an Sicherheit benötigen, brauchen Sie einen Postleitzahlen-Referenzdatensatz und eine straßenebene Datenbank, was ein anderes Produkt als ein Formatprüfer ist.
| Prüftyp | Umfasst | Beweist | Beweist nicht |
|---|---|---|---|
| Musterabgleich | Alle 38 Länder | Wohlgeformt für dieses Land | Dass der Code vergeben ist |
| US-ZIP-Existenz | 40.979 US-ZIP-Zeilen | Der Code ist im Datensatz | Übereinstimmung von Stadt oder Straße |
| Pflichtfeldregel | Formularebene | Übermittlung kann fortgesetzt werden | Jegliche reale Gültigkeit |
| Länge und Zeichensatz | Feldebene | Speicherung läuft nicht über | Länderkorrektheit |
Regex-Details, die Produktionsfehler verursachen
Verankern Sie jedes Muster. Ein nicht verankertes /\d{5}/ findet die fünf Ziffern innerhalb einer neunstelligen Zeichenkette und meldet Erfolg. Verwenden Sie ^ und $ oder die entsprechende Full-Match-API. In JavaScript findet \d nur ASCII-Ziffern; in Python findet \d standardmäßig Unicode-Ziffern, sodass ein Muster östliche arabische Ziffern akzeptieren kann, es sei denn, Sie kompilieren mit re.ASCII oder schreiben [0-9].
Entscheiden Sie explizit, ob das Trennzeichen erforderlich ist. Für die Anzeige fügen Sie das kanonische Trennzeichen selbst ein. Für die Eingabe akzeptieren Sie null oder ein Leerzeichen oder Bindestrich und normalisieren. Seien Sie vorsichtig mit Bindestrichen in Zeichenklassen, wo sie Bereiche definieren, es sei denn, sie werden maskiert oder an letzter Stelle platziert. Und verwenden Sie kein Case-Insensitive-Flag, um einen Normalisierungsfehler zu überdecken: Schreiben Sie den Wert beim Speichern in Großbuchstaben und halten Sie die Anzeigeform kanonisch.
- Mit ^ und $ verankern oder eine Full-Match-Funktion verwenden
- [0-9] verwenden, wenn ASCII-Ziffern gemeint sind
- Optionale Trennzeichen bei der Eingabe akzeptieren, kanonische Trennzeichen bei der Anzeige ausgeben
- Bindestriche maskieren oder in Zeichenklassen an letzter Stelle platzieren
- Vor dem Abgleich in Großbuchstaben umwandeln, statt Case-Flags zu verstreuen
- Geschützte Leerzeichen und Zero-Width-Zeichen explizit ablehnen
Beim Schreiben normalisieren, bei der Anzeige formatieren
Speichern Sie eine kanonische Form und leiten Sie die Anzeigeform ab. Die kanonische Form ist üblicherweise Großbuchstaben mit dem Standardtrennzeichen oder nur Ziffern, wenn das Trennzeichen rein konventionell ist. Behalten Sie die rohe Benutzereingabe in einer separaten Spalte, wenn Sie einen Audit-Trail benötigen, denn Normalisierung ist verlustbehaftet und ein Support-Mitarbeiter muss möglicherweise genau sehen, was eingegeben wurde.
Die länderspezifische Normalisierung ist klein, aber real. Kanada will Großbuchstabe-Ziffer-Großbuchstabe, Leerzeichen, Ziffer-Großbuchstabe-Ziffer. Die Niederlande wollen Großbuchstaben nach den Ziffern. Das Vereinigte Königreich will ein einzelnes Leerzeichen und Großbuchstaben. Brasilien und Japan verwenden einen Bindestrich, den Benutzer häufig weglassen, also in die Form mit Bindestrich normalisieren. Deutschland will überhaupt kein Trennzeichen und muss die führende Null behalten.
| Land | Rohe Eingabe | Gespeicherte kanonische Form | Anzeige |
|---|---|---|---|
| Kanada | k1a0b1 | K1A 0B1 | K1A 0B1 |
| Niederlande | 1012ab | 1012 AB | 1012 AB |
| Vereinigtes Königreich | sw1a1aa | SW1A 1AA | SW1A 1AA |
| Brasilien | 01310100 | 01310-100 | 01310-100 |
| Japan | 1000001 | 100-0001 | 100-0001 |
| Deutschland | 10115 | 10115 | 10115 |
| Schweden | 11455 | 114 55 | 114 55 |
Ein Testkorpus zum Kopieren
Jeder Validator braucht einen Korpus mit mindestens einem gültigen und einem ungültigen Fall pro Land sowie Fällen, die speziell Normalisierung und Speicherung testen. Die folgende Tabelle ist ein Ausgangssatz. Beachten Sie, dass mehrere ungültige Fälle aus länderspezifischen Gründen ungültig sind und nicht aus generischen, was der Punkt ist, an dem die meisten handgeschriebenen Tests zu früh aufhören.
Fügen Sie Fälle für die Länder ohne Postleitzahl, für führende Nullen und für die Trennzeichenvarianten hinzu, die Benutzer tatsächlich eingeben. Wenn der Validator zwischen Client und Server geteilt wird, führen Sie denselben Korpus gegen beide Implementierungen aus; eine Abweichung zwischen einem permissiven Client und einem strikten Server ist die häufigste Quelle von Meldungen wie „Das Formular hat es akzeptiert, aber die API hat es abgelehnt“.
| Fall | Wert | Land | Erwartet |
|---|---|---|---|
| Gültige ZIP+4 | 97205-2515 | Vereinigte Staaten | Akzeptieren |
| Ungültige ZIP+4 | 97205-251 | Vereinigte Staaten | Ablehnen |
| Gültig kanadisch | K1A 0B1 | Kanada | Akzeptieren |
| Ungültiger kanadischer Buchstabe | D1A 0B1 | Kanada | Ablehnen |
| Gültig UK | SW1A 1AA | Vereinigtes Königreich | Akzeptieren |
| Fehlender UK-Inward-Code | SW1A | Vereinigtes Königreich | Ablehnen |
| Deutsche führende Null | 01067 | Deutschland | Akzeptieren und erhalten |
| Buchstaben in einem numerischen System | 1011A | Deutschland | Ablehnen |
| Kein Code | Hongkong | Als leer akzeptieren | |
| Erfundener Code | 99999 | Vereinigte Arabische Emirate | Feld ablehnen |
Fragen
- Hongkong und die Vereinigten Arabischen Emirate haben keine, und beide sind im 38-Länder-Fixture-Set dieser Seite. Der Generator gibt für sie ein leeres Postleitzahlfeld zurück, statt einen Wert zu erfinden.
- Nein. Ein struktureller Treffer bedeutet nur, dass der Wert wohlgeformt ist. Nur US-ZIPs erhalten hier eine Existenzprüfung gegen 40.979 Zeilen, und kein Land erhält eine Zustellbarkeitsaussage.
- Niemals. Kanada, das Vereinigte Königreich, die Niederlande, Irland, Malta und Argentinien verwenden Buchstaben, und Deutschland, Frankreich, Spanien, Italien und Polen haben bedeutsame führende Nullen.
- Der niederländische Code besteht aus vier Ziffern gefolgt von zwei Großbuchstaben, zum Beispiel 1012 AB. Die Buchstaben sind Teil des Codes, kein Regionssuffix, und eine reine Ziffern-Regex weist gültige Adressen zurück.
- Eingaben mit null oder einem Leerzeichen akzeptieren, in Großbuchstaben umwandeln und ein einzelnes kanonisches Trennzeichen speichern. Für die Anzeige die kanonische Form ausgeben, statt wiederzugeben, was der Benutzer eingegeben hat.
Welche Länder haben keine Postleitzahlen?+
Bedeutet eine gültige Postleitzahl, dass die Adresse real ist?+
Sollten Postleitzahlen als Integer gespeichert werden?+
Warum setzen die Niederlande Buchstaben nach die Ziffern?+
Wie sollte ich das Leerzeichen in einem UK- oder kanadischen Code behandeln?+
Beispiele sind synthetisch. Verwenden Sie eine generierte Adresse nicht für Identitätsprüfungen, Kontoregistrierungen oder Lieferungen.