Regex US ZIP code (ZIP and ZIP+4)
The USPS states plainly that ZIP+4 is written 'five digits, a hyphen, and four digits'. The most-voted Stack Overflow answer (371 votes) nonetheless accepts a space instead of the hyphen: '12345 6789' passes. Another, at 93 votes, makes the hyphen optional, so '123456789' passes too. And every popular regex, including validator.js's and jquery-validation's, accepts '00000', a ZIP that was never assigned: the lowest real ZIP is 00501 (Holtsville, New York). Here's a pattern following the USPS rule, compared against those real attempts.
/^(?!00000)[0-9]{5}(?:-[0-9]{4})?$/passes 24/24 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| Stack Overflow (93 votes) — tiret facultatif : « 123456789 » passe, alors que l'USPS dit « un tiret » ; accepte aussi « 00000 » | ^\d{5}([\-]?\d{4})?$ | 21 / 24 | safe |
| 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 | safe |
| 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 | safe |
Implementation
const re = new RegExp("^(?!00000)[0-9]{5}(?:-[0-9]{4})?$", "");
re.test(input);Limits
- 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.
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
- German postal code (PLZ)
- 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
- All postal codes by country