Regex code postal suédois
Un postnummer suédois s'écrit « 111 22 » : 3 chiffres, une espace, 2 chiffres. Le pays n'est découpé qu'en 86 zones numérotées de 10 à 98, et selon une fiche de PostNord de 2017, les zones 32, 48, 49 et 99 ne sont pas utilisées. Aucune des trois tentatives réelles ne s'en préoccupe : validator.js laisse passer « 99999 », un gist accepte même « 000 00 » et un nombre quelconque d'espaces au milieu. Et le fichier GeoNames gère le préfixe « SE » à l'envers : il accepte « SE111 22 » mais rejette « SE-111 22 », la forme qu'utilise Google. Voici un motif qui exclut ces zones, comparé à ces trois tentatives.
/^(?:SE-)?(?!32|48|49|99)[1-9][0-9]{2} ?[0-9]{2}$/passe 23/23 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| GeoNames (countryInfo.txt) — gère le préfixe à l'envers : accepte « SE111 22 » mais rejette « SE-111 22 » ; espace obligatoire (« 11122 » rejeté) ; accepte « 000 00 » et la zone 99 inutilisée | ^(?:SE)?\d{3}\s\d{2}$ | 14 / 23 | sûr |
| validator.js — exclut le 0 initial mais accepte les zones inutilisées (« 32000 », « 99999 »), et rejette le préfixe « SE- » | ^[1-9]\d{2}\s?\d{2}$ | 18 / 23 | sûr |
| Gist jamesbar2 (repris par plusieurs projets) — « \s* » accepte n'importe quel nombre d'espaces ou même un saut de ligne au milieu, et « 000 00 » (zone inexistante) | ^\d{3}\s*\d{2}$ | 15 / 23 | sûr |
Implémentation
const re = new RegExp("^(?:SE-)?(?!32|48|49|99)[1-9][0-9]{2} ?[0-9]{2}$", "");
re.test(input);Limites
- Valide seulement la FORME (5 chiffres, espace facultative après le troisième, zone de 10 à 98) : ne vérifie pas qu'un postnummer précis est réellement attribué. PostNord marque même certains codes d'une zone active comme « Används ej » (non utilisés), par exemple 400 00.
- Exclut les zones 32, 48, 49 et 99 d'après la fiche PostNord de 2017 : si PostNord en attribue une plus tard, ce motif la rejettera à tort. À revérifier avant de dépendre de cette exclusion sur un produit à long terme.
- Le préfixe facultatif « SE- » est documenté par Google (champ postprefix) et python-stdnum, pas par la fiche PostNord elle-même, qui ne mentionne que la forme « 111 22 » : traitez-le comme une tolérance de saisie plutôt qu'une règle officielle.
- Ne tolère qu'une seule espace, ou aucune : « 111 22 » (deux espaces) ou une tabulation sont rejetés, contrairement à plusieurs tentatives comparées ici. Normalisez la saisie avant validation si vos utilisateurs collent du texte.
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 portugais
- 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