Regex code postal espagnol
Un code postal espagnol a 5 chiffres, et les deux premiers désignent la province, de 01 à 52 (50 provinces, plus Ceuta en 51 et Melilla en 52), selon l'ordre du BOE de 1995. Sur un forum en 2006, l'auteur d'une question écrit « ^[00-52]{2}[0-9]{3}$ » en croyant exprimer « de 00 à 52 » : « [00-52] » est en fait l'ensemble des chiffres 0 à 5, donc Madrid (28013) et Barcelone (08019) sont rejetés. La première réponse « corrige » en acceptant la province 00, qui n'existe pas. Voici un motif qui borne vraiment le préfixe à 01-52, comparé à ces tentatives réelles.
/^(?:0[1-9]|[1-4][0-9]|5[0-2])[0-9]{3}$/passe 22/22 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Foros del Web (message d'origine, 2006) — « [00-52] » est l'ensemble des chiffres 0 à 5, pas la plage 00-52 : rejette Madrid (28013) et Barcelone (08019), accepte « 00000 » et « 53000 » | ^[00-52]{2}[0-9]{3}$ | 14 / 22 | sûr |
| Foros del Web (première réponse, même fil) — corrige la plage mais accepte la province 00 : « 00000 » et « 00123 » passent | ^(5[0-2]|[0-4][0-9])[0-9]{3}$ | 20 / 22 | sûr |
| desarrollowp.com (atelier WordCamp Séville) — non ancrée : « 280133 », « ES-28013 » et « 128013 » passent ; accepte la province 00 volontairement (publiée avec le drapeau g) | (?:[0-4][0-9]|5[0-2])[0-9]{3} | 17 / 22 | sûr |
| GeoNames (countryInfo.txt) — 5 chiffres sans borne de province : « 00000 », « 53000 » et « 99999 » passent | ^(\d{5})$ | 18 / 22 | sûr |
Implémentation
const re = new RegExp("^(?:0[1-9]|[1-4][0-9]|5[0-2])[0-9]{3}$", "");
re.test(input);Limites
- Valide seulement la FORME (5 chiffres, province de 01 à 52) : ne vérifie pas qu'un code est réellement attribué par Correos. Un code comme « 52999 » passe, alors que le plus haut code des données GeoNames est 52080.
- L'ordre du BOE de 1995 fixe la règle de la province (01 à 52, avec Ceuta 51 et Melilla 52), mais ne dit pas lui-même « 5 chiffres » : cette partie vient de Wikipédia (source de dernier recours), aucune page Correos n'ayant pu être consultée.
- Le zéro initial est significatif (« 01001 », Vitoria-Gasteiz) : stockez le code en texte, pas en entier, sinon il devient « 1001 » et échoue à ce motif.
- Rejette le préfixe « ES- » parfois écrit dans l'adressage international, ainsi que tout nom de localité accolé (« 28013 Madrid ») : séparez-les du code avant validation.
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 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