Regex code postal français
Un fil Stack Overflow entier s'est perdu à essayer de faire matcher « 2A »/« 2B » dans un code postal — alors qu'un code postal français ne contient jamais de lettre, seulement 5 chiffres (Wikipédia le précise explicitement : le code postal est différent du code INSEE). Voici un motif corrigé des deux vrais bugs trouvés dans ce fil, comparé aux tentatives réelles.
/^(?:(?:0[1-9]|[1-8]\d|9[0-5])\d{3}|97[1-8]\d{2})$/passe 21/21 cas
Comparatif des patterns existants
| Source | pattern | Score sur le 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 | sûr |
| 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 | sûr |
| 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 | sûr |
Implémentation
const re = new RegExp("^(?:(?:0[1-9]|[1-8]\\d|9[0-5])\\d{3}|97[1-8]\\d{2})$", "");
re.test(input);Limites
- 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é.
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 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
- ZIP code américain (ZIP et ZIP+4)
- Tous les codes postaux par pays