Regex French postal code
An entire Stack Overflow thread got lost trying to match "2A"/"2B" in a postal code — but a French postal code never contains a letter, only 5 digits (Wikipedia explicitly notes the postal code differs from the INSEE code). Here's a pattern fixed of two real bugs found in that thread, compared against the real attempts.
/^(?:(?:0[1-9]|[1-8]\d|9[0-5])\d{3}|97[1-8]\d{2})$/passes 21/21 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — tentative de l'auteur de la question (posée dans la question elle-même) | ^(0[1-9]|[1-8]\d|9[0-5])\d{3}$ | 19 / 21 | safe |
| Stack Overflow — réponse de Toto, tente de gérer « 2A »/« 2B » (4 votes) | ^(?:(?:0[1-9]|[13-8][0-9]|2[ab1-9]|9[0-5])(?:[0-9]{3})?|9[78][1-9](?:[0-9]{2})?)$ | 18 / 21 | safe |
| Stack Overflow — réponse de chris85, base du motif recommandé mais avec 2 bugs (2 votes) | ^(?:(?:(?:0[1-9]|[1-8]\d|9[0-4])(?:\d{3})?)|97[1-8]|98[4-9]|2[abAB])$ | 18 / 21 | safe |
Implementation
const re = new RegExp("^(?:(?:0[1-9]|[1-8]\\d|9[0-5])\\d{3}|97[1-8]\\d{2})$", "");
re.test(input);Limits
- Le code postal est purement administratif : il ne prouve pas qu'une adresse existe réellement à cet endroit (deux communes voisines peuvent partager le même code, une grande ville peut en avoir plusieurs).
- Ne couvre pas tous les territoires ultramarins (Polynésie 987xx, Nouvelle-Calédonie 988xx, Saint-Pierre-et-Miquelon 975xx) : la plage 971-978 retenue ici couvre les DROM les plus courants, pas l'exhaustivité.
- Ne vérifie jamais la cohérence avec la ville renseignée à côté (rien n'empêche un formulaire de laisser passer « 75001 » avec « Marseille » écrit en toutes lettres).
- Une regex n'est pas le bon outil pour maintenir une liste de plages valides dans le temps : de nouveaux codes apparaissent, d'anciens sont fusionnés — une base de données à jour (comme celle de La Poste ou data.gouv.fr) est plus fiable qu'un motif figé.
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
- 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
- US ZIP code (ZIP and ZIP+4)
- All postal codes by country