Regex German postal code (PLZ)
A German postal code is 5 digits, but not just any: regions 00, 05, 43 and 62 have no assigned postal code. Almost every regex just reuses '\d{5}' and accepts '05000'. The accepted answer of one Stack Overflow question limits the first digit to 0, 1, 2, 4, 6, 7 or 8: it rejects Hanover (30159), Cologne (50667) and Erfurt (99084). And a commercial Shopware plugin page publishes, for '5 consecutive digits', a regex counting seven, which rejects every real code. Here's a pattern excluding the regions without codes, compared against those attempts.
/^(?!00|05|43|62)[0-9]{5}$/passes 24/24 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Stack Overflow (93 votes) — seule à exclure les régions 05, 43 et 62, mais non ancrée avec \b : « D-10115 », « 10115 Berlin » et « 10115- » passent ; accepte aussi « 01000 », sous le plus bas PLZ attribué | \b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b | 20 / 24 | safe |
| Stack Overflow (réponse acceptée) — conçue pour extraire un PLZ d'un texte, pas pour valider : premier chiffre limité à 0, 1, 2, 4, 6, 7, 8, donc rejette Hanovre (30159), Cologne (50667), Erfurt (99084) ; non ancrée | \b[0124678][0-9]{4}\b(?!\s?[ \/-]\s?[0-9]+) | 12 / 24 | safe |
| validator.js — 5 chiffres sans autre vérification : accepte « 00000 », « 05000 » et « 43000 », des régions sans code postal | ^\d{5}$ | 21 / 24 | safe |
| Plugin Shopware commercial (page de la boutique) — la page présente comme « 5 chiffres consécutifs » une regex à sept groupes de chiffres, qui rejette tous les vrais codes postaux | ^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]$ | 14 / 24 | safe |
Implementation
const re = new RegExp("^(?!00|05|43|62)[0-9]{5}$", "");
re.test(input);Limits
- Valide seulement la FORME (5 chiffres, hors régions 00, 05, 43 et 62) : ne vérifie pas qu'un PLZ est réellement attribué par la Deutsche Post. Seuls environ 30 000 des 100 000 codes possibles sont utilisés, selon Wikipédia.
- L'exclusion des régions 00, 05, 43 et 62 vient de la page Wikipédia allemande (source de dernier recours) : la page de presse de la Deutsche Post sur le PLZ à 5 chiffres n'a pas pu être lue en entier. À revérifier si votre cas est sensible, notamment pour la région 62, utilisée en interne par un centre de tri.
- Le plus bas PLZ attribué est 01001 (Dresde) : « 01000 » passe pourtant ce motif, la regex ne peut pas énumérer les codes inutilisés d'une région active.
- Le zéro initial est significatif (« 01219 » est un vrai code de Dresde) : stockez le PLZ en texte, pas en entier, sinon il devient « 1219 » et échoue à ce motif.
Postal codes for other countries
- Argentine postal code (CPA)
- Australian postcode
- Brazilian postal code (CEP)
- Canadian postal code
- Czech postal code (PSČ)
- Dutch postal code
- French postal code
- Indian PIN code
- Irish Eircode
- Japanese postal code
- Polish postal code
- Portuguese postal code
- Spanish postal code
- Swedish postal code
- Swiss postal code (PLZ/NPA)
- UK postcode
- US ZIP code (ZIP and ZIP+4)
- All postal codes by country