Regex code postal portugais
Un code postal portugais s'écrit « 1000-205 » : 4 chiffres, un tiret, 3 chiffres, et le premier chiffre vaut toujours 1 à 9, car le 0 n'existe pas. Trois tentatives réelles, chacune fautive à sa façon : la regex de validator.js écrit « \d{3}? » et laisse croire à un dernier chiffre optionnel, alors que ce quantificateur paresseux ne change rien (« 1000-20 » échoue) ; une bibliothèque TypeScript accepte « 1000 » seul, l'ancien format à 4 chiffres de 1976 ; le fichier GeoNames accepte un nom de localité derrière le code, mais pas « 9500-101 Ponta Delgada », à cause d'une seule espace autorisée. Voici un motif strict, comparé à ces trois tentatives.
/^[1-9][0-9]{3}-[0-9]{3}$/passe 23/23 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| GeoNames (countryInfo.txt) — accepte un nom de localité après le code, mais une seule espace et des lettres ASCII : « 9500-101 Ponta Delgada » et « 4700-001 Évora » échouent ; accepte aussi « 0000-000 » | ^\d{4}-\d{3}\s?[a-zA-Z]{0,25}$ | 20 / 23 | sûr |
| validator.js — « \d{3}? » n'est pas un dernier chiffre optionnel (quantificateur paresseux sans effet) ; accepte aussi « 0000-000 » (premier chiffre 0 inexistant) | ^\d{4}\-\d{3}?$ | 21 / 23 | sûr |
| ts-postcode-validator — groupe « -000 » facultatif : accepte « 1000 » ou « 0000 » seuls, l'ancien format à 4 chiffres, et n'impose pas le premier chiffre 1-9 | ^\d{4}([\-]\d{3})?$ | 20 / 23 | sûr |
Implémentation
const re = new RegExp("^[1-9][0-9]{3}-[0-9]{3}$", "");
re.test(input);Limites
- Valide seulement la FORME (4 chiffres, tiret, 3 chiffres, premier chiffre 1 à 9) : ne vérifie pas qu'un code est réellement attribué par les CTT. Les 3 derniers chiffres désignent un îlot d'immeubles ou une adresse précise, aucune regex ne peut savoir lesquels existent.
- Rejette le code suivi de la localité (« 1000-205 Lisboa »), qui s'écrit pourtant couramment sur une adresse : séparez le code du nom de localité avant de valider. Rejette aussi le code à 4 chiffres seuls, l'ancien format de 1976, encore vu sur de vieux courriers.
- Le tiret fait partie du format : aucune source consultée ne le déclare facultatif. « 1000205 » est donc rejeté ; si votre saisie l'autorise, normalisez-la avant validation.
- La règle « premier chiffre de 1 à 9 » vient de la page Wikipédia sur les codes postaux portugais (la page des CTT n'a pas pu être consultée) et d'une bibliothèque Django, pas d'une page officielle citée ici : à vérifier si votre cas est sensible.
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 canadien
- code postal espagnol
- code postal français
- code postal japonais
- code postal néerlandais
- code postal polonais
- 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