Regex code postal britannique (UK postcode)
Le gouvernement britannique publie lui-même une regex officielle pour valider ses codes postaux — sauf qu'elle contient au moins trois bugs réels, documentés en détail dans une réponse à 269 votes sur Stack Overflow : une faute de frappe (« [AZa-z] » au lieu de « [A-Za-z] »), un groupe optionnel placé sur le mauvais élément, et surtout une alternation mal parenthésée qui laisse passer des chaînes comme « GIR 0AAfoo ». Deux autres tentatives réelles, chacune sur un fil différent, oublient chacune un point distinct : l'une la lettre optionnelle avant l'espace, l'autre les zones à une seule lettre (comme « N1 7TE » ou « M1 3HZ »). Voici un motif corrigé, comparé à ces trois tentatives réelles.
/^([A-Za-z]{1,2}\d[A-Za-z\d]? ?\d[A-Za-z]{2}|[Gg][Ii][Rr] ?0[Aa]{2})$/passe 21/21 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Gouvernement britannique — regex officielle (documentation Bulk Data Transfer), truffée de bugs réels documentés : faute de frappe, groupe optionnel mal placé, alternation mal parenthésée | ^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$ | 10 / 21 | sûr |
| Stack Overflow — tentative de l'auteur d'une autre question, non ancrée, oublie la lettre optionnelle avant l'espace (échoue sur « WC2F 3BT », signalé en commentaire) | [A-Z]{1,2}[0-9]{1,2} ?[0-9][A-Z]{2} | 14 / 21 | sûr |
| Stack Overflow — réponse postée sur le même fil, suppose exactement 2 lettres, oublie les zones à une seule lettre (« N1 7TE », signalé dans la réponse suivante du même fil) | ^[A-Z]{2}\d[A-Z]?\s?\d[A-Z]{2}$ | 16 / 21 | sûr |
Implémentation
const re = new RegExp("^([A-Za-z]{1,2}\\d[A-Za-z\\d]? ?\\d[A-Za-z]{2}|[Gg][Ii][Rr] ?0[Aa]{2})$", "");
re.test(input);Limites
- Valide uniquement la FORME générale (lettres/chiffres, longueur) : ne vérifie pas que la zone postale (les 1 ou 2 premières lettres, comme « SE » ou « M ») correspond à une zone réellement attribuée par Royal Mail.
- Ne couvre pas les codes postaux des territoires britanniques d'outre-mer (Gibraltar, îles Falkland, Sainte-Hélène...), qui suivent des formats spéciaux distincts, ni le cas historique « SAN TA1 » (Santa Claus, Royaume-Uni).
- N'impose pas d'espace unique à un emplacement fixe : « SE50EG » (sans espace) et « SE5 0EG » (avec espace) sont tous deux acceptés, ce qui est correct pour la validation mais ne normalise pas l'affichage.
- Le respect de la casse n'est pas imposé par la regex elle-même (elle accepte majuscules et minuscules mêlées) : une normalisation en majuscules est généralement effectuée séparément avant stockage ou affichage.
Codes postaux d’autres pays
- code postal allemand (PLZ)
- code postal argentin (CPA)
- code postal australien
- code postal brésilien (CEP)
- code postal canadien
- code postal espagnol
- code postal français
- 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