Regex Spanish postal code
A Spanish postal code has 5 digits, and the first two designate the province, from 01 to 52 (50 provinces, plus Ceuta at 51 and Melilla at 52), per the 1995 BOE order. On a forum in 2006, the author of a question writes '^[00-52]{2}[0-9]{3}$' believing it means 'from 00 to 52': '[00-52]' is actually the set of digits 0 to 5, so Madrid (28013) and Barcelona (08019) are rejected. The first reply 'fixes' it by accepting province 00, which does not exist. Here's a pattern truly bounding the prefix to 01-52, compared against those real attempts.
/^(?:0[1-9]|[1-4][0-9]|5[0-2])[0-9]{3}$/passes 22/22 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
| GeoNames (countryInfo.txt) — 5 chiffres sans borne de province : « 00000 », « 53000 » et « 99999 » passent | ^(\d{5})$ | 18 / 22 | safe |
Implementation
const re = new RegExp("^(?:0[1-9]|[1-4][0-9]|5[0-2])[0-9]{3}$", "");
re.test(input);Limits
- 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.
Postal codes for other countries
- Argentine postal code (CPA)
- Australian postcode
- Brazilian postal code (CEP)
- Canadian postal code
- 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
- Swedish postal code
- Swiss postal code (PLZ/NPA)
- UK postcode
- US ZIP code (ZIP and ZIP+4)
- All postal codes by country