Regex code postal canadien
L'auteur de la question de référence sur Stack Overflow avait un « problem child » : sa regex sans ancrage acceptait « A1A1B1C », un caractère de trop. Une réponse corrige l'ancrage mais oublie une règle réelle signalée en commentaire : Postes Canada n'utilise jamais les lettres D, F, I, O, Q, U dans un code postal, ni W ni Z en première position. Voici un motif qui respecte ces exclusions, comparé à ces deux tentatives et à une troisième qui, en corrigeant le problème du « W/Z » en tête, oublie à son tour de gérer l'espace ou le tiret usuels.
/^[ABCEGHJ-NPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ -]?\d[ABCEGHJ-NPRSTV-Z]\d$/ipasse 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le 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 | sûr |
| 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 | sûr |
| 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 | sûr |
Implémentation
const re = new RegExp("^[ABCEGHJ-NPRSTVXY]\\d[ABCEGHJ-NPRSTV-Z][ -]?\\d[ABCEGHJ-NPRSTV-Z]\\d$", "i");
re.test(input);Limites
- 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.
Codes postaux d’autres pays
- code postal allemand (PLZ)
- code postal argentin (CPA)
- code postal australien
- code postal brésilien (CEP)
- code postal britannique (UK postcode)
- 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