Regex ZIP code américain (ZIP et ZIP+4)
L'USPS écrit noir sur blanc que le ZIP+4 s'écrit « cinq chiffres, un tiret et quatre chiffres ». La réponse la plus votée sur Stack Overflow (371 votes) accepte pourtant une espace à la place du tiret : « 12345 6789 » passe. Une autre, à 93 votes, rend le tiret facultatif, donc « 123456789 » passe aussi. Et toutes les regex populaires, même celles de validator.js et de jquery-validation, acceptent « 00000 », un ZIP qui n'a jamais été attribué : le plus bas ZIP réel est 00501 (Holtsville, New York). Voici un motif qui suit la règle de l'USPS, comparé à ces tentatives réelles.
/^(?!00000)[0-9]{5}(?:-[0-9]{4})?$/passe 24/24 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow (371 votes, réponse acceptée) — accepte une espace à la place du tiret (« 12345 6789 »), que l'USPS ne prévoit pas ; accepte aussi « 00000 » jamais attribué | ^\d{5}(?:[-\s]\d{4})?$ | 21 / 24 | sûr |
| Stack Overflow (93 votes) — tiret facultatif : « 123456789 » passe, alors que l'USPS dit « un tiret » ; accepte aussi « 00000 » | ^\d{5}([\-]?\d{4})?$ | 21 / 24 | sûr |
| Stack Overflow (8 votes) — séparateur et partie +4 tous deux facultatifs : « 12345- » ou « 12345 » suivi d'une espace passent, tout comme « 123451234 » | ^\d{5}[-\s]?(?:\d{4})?$ | 19 / 24 | sûr |
| GeoNames (countryInfo.txt) — correcte sur la forme (tiret obligatoire pour la partie +4), seul défaut : accepte « 00000 » qui n'a jamais été un ZIP attribué | ^\d{5}(-\d{4})?$ | 22 / 24 | sûr |
Implémentation
const re = new RegExp("^(?!00000)[0-9]{5}(?:-[0-9]{4})?$", "");
re.test(input);Limites
- Valide seulement la FORME (5 chiffres, puis tiret et 4 chiffres facultatifs) : ne vérifie pas qu'un ZIP est réellement attribué par l'USPS. Seul « 00000 » est exclu ; « 00001 » à « 00500 » et bien d'autres plages inutilisées passent, qu'une regex ne peut pas connaître sans les énumérer.
- Le plus bas ZIP réel (00501) et le plus haut (99950) viennent de Wikipédia, source de dernier recours : à ne pas coder en dur comme bornes strictes, l'USPS pouvant attribuer de nouveaux codes.
- N'accepte pas « 12345 6789 » (espace à la place du tiret) : l'USPS exige un tiret. Si vos utilisateurs collent des ZIP+4 avec une espace, normalisez-les avant validation.
- Ne couvre pas les codes des territoires (Porto Rico, Guam, Îles Vierges, forces armées APO/FPO/DPO), qui suivent le même format mais ont des plages dédiées, ni les ZIP militaires dont l'usage diffère.
Codes postaux d’autres pays
- code postal allemand (PLZ)
- code postal argentin (CPA)
- code postal australien
- code postal brésilien (CEP)
- code postal britannique (UK postcode)
- code postal canadien
- code postal espagnol
- code postal français
- code postal japonais
- code postal néerlandais
- code postal polonais
- code postal portugais
- code postal suédois
- code postal suisse (NPA)
- code postal tchèque (PSČ)
- Eircode irlandais
- PIN code indien
- Tous les codes postaux par pays