Rexact
Cheatsheet

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

SourcepatternScore sur le corpusReDoS
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 / 21sû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 / 21sû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 / 21sû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

Pages liées