Rexact
Cheatsheet

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

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

Pages liées