Rexact
Cheatsheet

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$/i
passes 20/20 cases

Comparison of existing patterns

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

Related pages