Rexact
Cheatsheet

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

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

Related pages