Regex UK postcode
The UK government itself publishes an official regex to validate its own postcodes - except it contains at least three real bugs, documented in detail in a 269-vote Stack Overflow answer: a typo ("[AZa-z]" instead of "[A-Za-z]"), an optional group placed on the wrong element, and above all a badly parenthesized alternation that lets strings like "GIR 0AAfoo" through. Two other real attempts, each from a different thread, each miss a distinct point: one the optional letter before the space, the other single-letter areas (like "N1 7TE" or "M1 3HZ"). Here's a fixed pattern, compared against these three real attempts.
/^([A-Za-z]{1,2}\d[A-Za-z\d]? ?\d[A-Za-z]{2}|[Gg][Ii][Rr] ?0[Aa]{2})$/passes 21/21 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
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);Limits
- 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.
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
- French 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)
- US ZIP code (ZIP and ZIP+4)
- All postal codes by country