Regex Canadian postal code
The reference Stack Overflow question's author had a "problem child": their unanchored regex accepted "A1A1B1C", one character too many. An answer fixes the anchoring but misses a real rule flagged in a comment: Canada Post never uses the letters D, F, I, O, Q, U in a postal code, nor W or Z in the first position. Here's a pattern that respects those exclusions, compared against both of those attempts and a third that, while fixing the leading W/Z issue, forgets to handle the usual space or hyphen.
/^[ABCEGHJ-NPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ -]?\d[ABCEGHJ-NPRSTV-Z]\d$/ipasses 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Stack Overflow — réponse à 50 votes, correctement ancrée mais sans aucune exclusion de lettres (bug signalé en commentaire : accepte D/F/I/O/Q/U/W/Z n'importe où) | ^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$ | 16 / 20 | safe |
| Stack Overflow — réponse à 29 votes (validateur combiné US/CA), non ancrée, autorise W/Z en première position (bug signalé en commentaire) | ([ABCEGHJKLMNPRSTVWXYZ]\d){3} | 11 / 20 | safe |
| Stack Overflow — tentative de l'auteur de la question, démontrée dans la question elle-même comme acceptant un caractère de trop | [A-Za-z]\d[A-Za-z] ?\d[A-Za-z]\d | 13 / 20 | safe |
Implementation
const re = new RegExp("^[ABCEGHJ-NPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][ -]?\\d[ABCEGHJ-NPRSTV-Z]\\d$", "i");
re.test(input);Limits
- Valide uniquement la FORME générale (lettres autorisées, longueur) : ne vérifie pas que la combinaison lettre-chiffre de tête correspond réellement à une région de tri postal existante attribuée par Postes Canada.
- N'impose pas d'espace unique à un emplacement fixe : « H2Z1B8 » (sans séparateur), « H2Z 1B8 » (espace) et « H2Z-1B8 » (tiret) sont tous acceptés, ce qui est correct pour la validation mais ne normalise pas l'affichage.
- N'exclut pas certaines combinaisons régionales non attribuées à ce jour (par exemple les codes commençant par une lettre techniquement valide mais jamais utilisée dans les faits) : seules les exclusions universelles (D, F, I, O, Q, U partout ; W, Z en tête) sont vérifiées.
- 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)
- 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)
- UK postcode
- US ZIP code (ZIP and ZIP+4)
- All postal codes by country