Postleitzahl Regex: Geprüfte Muster für DE, AT, CH und mehr

Redaktion AddressValid Aktualisiert 5 Min. Lesezeit

Kurz gesagt

Eine deutsche Postleitzahl hat fünf Ziffern, und keine beginnt mit 00. Ein passender regulärer Ausdruck lautet ^(?!00)\d{5}$. Prüfe die Eingabe erst, nachdem du Leerzeichen entfernt und sie als Text gespeichert hast. Ein Regex bestätigt nur die Form, nicht, ob es die Postleitzahl wirklich gibt.

Altes Londoner Straßenschild mit dem Postbezirk E.C.1 in roten Buchstaben
Foto: Ewan-M, CC BY-SA 2.0, via Wikimedia Commons

Fünf Ziffern. Klingt nach dem einfachsten regulären Ausdruck der Welt, und genau deshalb wird er gern unterschätzt. Mal fehlt der Anker, mal schluckt Excel die führende Null von Dresden, mal lehnt das Formular 80331 mit Leerzeichen am Ende ab. Kunden aus Sachsen oder Thüringen merken so etwas zuerst, weil ihre Postleitzahlen mit 0 beginnen.

Hier sind Muster für Deutschland und die Länder, in die DACH-Shops am häufigsten liefern. Alle haben wir mit Node gegen gültige und ungültige Beispiele laufen lassen.

Das Muster für Deutschland

Deutsche Postleitzahlen haben seit der Reform von 1993 fünf Stellen. Die erste Ziffer steht für eine Leitzone, und die Zone 0 deckt Teile Ostdeutschlands ab. Dresden beginnt mit 01. Eine Postleitzahl, die mit 00 beginnt, gibt es nicht.

^(?!00)\d{5}$

Der Ausdruck verlangt genau fünf Ziffern vom Anfang bis zum Ende und schließt per negativem Lookahead die Doppelnull aus. Ergebnisse aus dem Testlauf:

EingabeNach BereinigungErgebnis
0106701067gültig
10671067abgelehnt (Null verloren)
0012300123abgelehnt
8033180331gültig
8033l8033Labgelehnt (kleines L statt Eins)

Wichtiger als der Regex selbst ist der Datentyp. Wer Postleitzahlen als Integer speichert, macht aus 01067 die Zahl 1067, und jede spätere Prüfung schlägt fehl. Text, immer.

Ohne Anker passt fast alles

Der häufigste Fehler ist das Muster \d{5} ohne ^ und $. Es sucht fünf Ziffern irgendwo im String. 123456 besteht die Prüfung, Tel 0221 123456 ebenfalls. Beides haben wir getestet, beides kam als gültig zurück.

Ein prominentes Beispiel für denselben Fehlertyp liefert das britische Innenministerium. Es hat in einem PDF für Visa-Sponsoren einen Regex für britische Postcodes veröffentlicht, der so aufgebaut ist: ^(GIR-Teil)|(normaler Teil)$. Die Alternative bindet schwächer als die Anker. Der Anfangsanker gilt also nur für den ersten Zweig, der Endanker nur für den zweiten. Im Test akzeptierte das Muster 123 SW1A 1AA und GIR 0AAxyz. Die Lösung ist ein Klammerpaar: ^(?:A|B)$. Nebenbei lehnt es W1A 4ZZ ab, eines der Beispiele von Royal Mail, weil im PDF eine Zeichenklasse [AZa-z] statt [A-Za-z] lautet.

Beim HTML-Attribut pattern kann dir das nicht passieren. Laut WHATWG-Spezifikation setzt der Browser den Ausdruck selbst zwischen ^(?: und )$ und kompiliert ihn mit dem Flag v. Im eigenen JavaScript musst du die Anker selbst setzen.

Erst bereinigen, dann streng prüfen

Nutzer tippen Leerzeichen am Ende, schreiben klein oder lassen bei britischen Postcodes das Leerzeichen weg. Ein strenger Regex auf die Roheingabe lehnt dann gültige Werte ab. Die Folge: Entwickler lockern das Muster so lange, bis es auch Unsinn akzeptiert.

Die bessere Reihenfolge ist Bereinigen, strenge Prüfung, Speichern der bereinigten Form:

const normalise = (cc, raw) => {
  let z = raw.trim().toUpperCase().replace(/\s+/g, '');
  if (cc === 'GB') z = z.replace(/^(.+)(.{3})$/, '$1 $2');
  if (cc === 'NL') z = z.replace(/^(\d{4})/, '$1 ');
  if (cc === 'PL') z = z.replace(/^(\d{2})-?(\d{3})$/, '$1-$2');
  return z;
};

Für Polen fügt die Funktion den Bindestrich ein, für die Niederlande das Leerzeichen nach den vier Ziffern, für Großbritannien das Leerzeichen vor den letzten drei Zeichen.

Muster für die Nachbarländer und UK

Postleitzahl-Muster nach Land (Eingabe vorher bereinigt)
KriteriumRegulärer AusdruckGültiges Beispiel
Deutschland^(?!00)\d{5}$01067
Österreich^[1-9]\d{3}$1010
Schweiz^[1-9]\d{3}$8001
Polen^\d{2}-\d{3}$00-950
Niederlande^[1-9]\d{3} (?!SA|SD|SS)[A-Z]{2}$1012 AB
Vereinigtes Königreich^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|[A-HK-Y][0-9]{1,2}|[0-9][A-HJKS-UW]|[A-HK-Y][0-9][ABEHMNPRV-Y]) [0-9][ABD-HJLNP-UW-Z]{2})$EC1A 1HQ

Alle Muster in Node.js mit gültigen und ungültigen Beispielen getestet.

Österreich und die Schweiz haben vierstellige Postleitzahlen ohne führende Null. Polen schreibt zwei Ziffern, Bindestrich, drei Ziffern, und hier ist eine führende Null erlaubt: 00-950 ist Warschau. Niederländische Postcodes bestehen aus vier Ziffern und zwei Buchstaben, wobei die Buchstabenpaare SA, SD, SS nicht vergeben werden; 1012 SS lehnt das Muster ab. Das britische Muster bildet die sechs Formen ab, die Royal Mail im Adresskatalog des Weltpostvereins nennt, von M2 5BQ bis EC1A 1HQ. Mehr zu britischen Adressen steht in der Anleitung Brief nach England adressieren.

Für Länder, für die du kein Muster hast, prüfst du besser gar nicht. Ein Pflichtfeld mit dem Ersatzmuster „mindestens ein Zeichen“ bringt Kunden dazu, 00000 einzutippen. Diese Werte verschmutzen später deine Daten.

Was ein Regex nicht kann

12345 ist formal eine gültige deutsche Postleitzahl. Ob sie vergeben ist und zu „Musterstadt“ passt, weiß der Ausdruck nicht. Großbritannien zeigt das Verhältnis besonders deutlich: Royal Mails Adressdatei kannte im August 2026 genau 1.810.763 Postcodes, das Muster akzeptiert ein Vielfaches davon.

Ein Regex ist ein billiger erster Filter gegen Tippfehler. Mehr nicht. Für ein Bestellformular lohnen sich drei Stufen:

Postleitzahl-Prüfung im Formular
  1. Beim Verlassen des FeldesBereinigen, dann Regex des gewählten Landes. Fehler sofort anzeigen.
  2. Beim AbsendenDieselbe Prüfung auf dem Server wiederholen, bereinigte Form speichern.
  3. Vor dem VersandVollständige Adresse gegen Postdaten abgleichen, etwa per API.

Die dritte Stufe erklärt der Ratgeber zur Adressprüfung per API. Welche Prüfungen überhaupt möglich sind, von der Form bis zum Bewohner, beschreibt der Beitrag Adresse überprüfen.

Postleitzahl und Ort gehören zusammen

Die nächste Prüfstufe nach dem Muster ist die Kombination. Passt 80331 zu München und nicht zu Hamburg? Dafür brauchst du eine Liste der Postleitzahlen mit zugehörigen Orten. Ein Regex kann das grundsätzlich nicht leisten.

Zwei deutsche Eigenheiten machen diese Plausibilitätsprüfung schwieriger, als sie klingt. Erstens haben Postfächer eigene Postleitzahlen, die sich von der Postleitzahl der Hausanschrift unterscheiden. Eine Firma kann also mit zwei verschiedenen Postleitzahlen in derselben Stadt korrekt sein. Zweitens gibt es Großempfänger mit einer eigenen Postleitzahl. Der Weltpostverein zeigt dafür eine Bank in Mannheim, deren Anschrift nur aus Firmenname und 68151 MANNHEIM besteht, ganz ohne Straße.

Wer Postleitzahl und Ort hart gegeneinander prüft, lehnt solche Adressen fälschlich ab. Besser ist eine weiche Warnung: „Postleitzahl und Ort passen nach unseren Daten nicht zusammen. Trotzdem verwenden?“ So fängst du Tippfehler ab, ohne Sonderfälle auszusperren. Wie deutsche Anschriften mit Postfach oder Packstation aufgebaut sind, zeigt der Ratgeber Brief richtig adressieren.

Testfälle, die jeder PLZ-Regex braucht

Ob du einen fertigen Ausdruck übernimmst oder einen eigenen schreibst: Lass ihn gegen eine feste Liste laufen, bevor er live geht.

Pflicht-Testfälle für Postleitzahl-Prüfungen
  • Eine gültige Postleitzahl mit führender Null, etwa 01067
  • Dieselbe ohne Null (1067), muss scheitern
  • Leerzeichen vor und nach der Zahl, muss nach Bereinigung bestehen
  • Sechs Ziffern und Text vor der Zahl, muss scheitern
  • Länderpräfix D-80331, muss scheitern oder einen Hinweis auslösen
  • Leerer String und ein einzelnes Leerzeichen

Ein Wort zum Länderpräfix: Die Deutsche Post schreibt in ihrem Eintrag beim Weltpostverein, dass vor deutschen Postleitzahlen auf keinen Fall D- oder DE- stehen soll, weil das die maschinelle Sortierung verzögern kann. Dein Formular sollte das Präfix deshalb nicht stillschweigend speichern. Ein Hinweis „Bitte ohne Länderkennzeichen“ hilft mehr als eine Fehlermeldung ohne Erklärung.

Für einzelne Adressen brauchst du keinen Code: Unser Adressformat-Check prüft Postleitzahl, Hausnummer und Zeilenfolge für 15 Länder direkt im Browser. Wer Millionen Datensätze statt eines Formularfelds prüft, verlagert die Regeln in eine Datenstrecke; das ist typische Arbeit für ein Studio wie OnlineBuilders.

Kopier die Testliste in deine Test-Suite und lass sie heute gegen das Muster laufen, das gerade in deinem Shop aktiv ist.

Häufige Fragen

Reicht \d{5} als Prüfung für deutsche Postleitzahlen?

Nur mit Anker. Ohne ^ und $ passt das Muster auch auf sechsstellige Zahlen oder auf eine Telefonnummer mit fünf Ziffern am Stück. Mit Ankern und dem Ausschluss von 00 am Anfang reicht es als Formprüfung. Ob die Postleitzahl vergeben ist, weiß es trotzdem nicht.

Warum wird aus 01067 plötzlich 1067?

Weil ein Programm die Postleitzahl als Zahl behandelt hat, meist Excel oder eine numerische Datenbankspalte. Führende Nullen gehen dabei verloren. Speichere Postleitzahlen immer als Text.

Soll das Formular D-80331 akzeptieren?

Nein, aber es sollte freundlich darauf hinweisen. Länderkennzeichen vor der Postleitzahl gehören laut Deutscher Post nicht auf Sendungen. Am besten fragst du das Land in einem eigenen Feld ab und lässt die Postleitzahl ohne Präfix eintragen.

Kann ein Regex prüfen, ob eine Postleitzahl existiert?

Nein. Er schließt unmögliche Formen aus. Ob 12345 tatsächlich vergeben ist und zur angegebenen Stadt passt, verrät nur ein Abgleich mit Postdaten.