Rexact
Cheatsheet

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

SourcepatternScore on the 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 / 21safe
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 / 21safe
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 / 21safe

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

Related pages