Regex code postal néerlandais
Un code postal néerlandais s'écrit « 1071 XX » : 4 chiffres, une espace facultative, 2 lettres. Deux règles passent presque partout inaperçues : le premier chiffre n'est jamais 0, et les paires de lettres SA, SD et SS sont exclues, car elles évoquent des organisations de l'Occupation. Une réponse à 93 votes rend même les lettres facultatives, donc « 1234 » seul passe. Et le folklore voulant que les lettres F, I, O, Q, U et Y soient interdites est périmé : elles sont autorisées pour les nouveaux codes depuis 2005, d'après Wikipédia. Voici le motif de la réponse acceptée à 80 votes, qui est le seul des cinq à tout régler, comparé à quatre tentatives réelles.
/^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$/ipasse 26/26 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| Stack Overflow (6 votes) — n'exclut ni le zéro initial ni les paires SA, SD, SS : « 0123 AB » et « 1234 SS » passent | ^\d{4} ?[a-z]{2}$ | 20 / 26 | sûr |
| Stack Overflow (93 votes) — lettres facultatives : « 1234 » seul passe ; accepte aussi SS, SA, SD ; « \s » laisse passer une tabulation ou un saut de ligne | ^[1-9][0-9]{3}\s?([a-zA-Z]{2})?$ | 21 / 26 | sûr |
| jquery-validation (postalcodeNL) — exclut le zéro initial mais accepte « 1234 SS », « 1234 SA » et « 1234 SD » | ^[1-9][0-9]{3}\s?[a-zA-Z]{2}$ | 22 / 26 | sûr |
| GeoNames (countryInfo.txt) — accepte le zéro initial (« 0123 AB ») et les paires SS, SA, SD | ^(\d{4}\s?[a-zA-Z]{2})$ | 20 / 26 | sûr |
Implémentation
const re = new RegExp("^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$", "i");
re.test(input);Limites
- Valide seulement la FORME (premier chiffre 1 à 9, 2 lettres hors SA, SD, SS) : ne vérifie pas qu'un code est réellement attribué par PostNL, ni qu'il correspond à une rue existante.
- Les règles viennent de Wikipédia (source de dernier recours : aucune page primaire PostNL n'a pu être consultée) et de la bibliothèque python-stdnum. La règle « premier chiffre 1 à 9 » vaut pour les Pays-Bas européens : les codes 0000 à 0999 sont réservés aux Pays-Bas caribéens, que ce motif rejette.
- Accepte minuscules et majuscules (drapeau i) alors que la convention est d'écrire les lettres en majuscules : normalisez-les avant stockage. Accepte aussi la forme sans espace (« 1012NP »), à normaliser en « 1012 NP » pour l'affichage.
- N'exclut pas les lettres F, I, O, Q, U et Y : elles étaient interdites à l'origine mais sont autorisées pour les nouveaux codes depuis 2005, donc un code comme « 1234 FI » est valide. Les rejeter, comme le suggère le folklore, rejetterait de vrais codes.
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 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