Regex Dutch postal code
A Dutch postal code is written '1071 XX': 4 digits, an optional space, 2 letters. Two rules go unnoticed almost everywhere: the first digit is never 0, and the letter pairs SA, SD and SS are excluded, as they evoke organisations of the Occupation. A 93-vote answer even makes the letters optional, so a bare '1234' passes. And the folklore that letters F, I, O, Q, U and Y are forbidden is outdated: they have been allowed for new codes since 2005, according to Wikipedia. Here's the pattern from the accepted 80-vote answer, the only one of five to get everything right, compared against four real attempts.
/^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$/ipasses 26/26 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
const re = new RegExp("^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$", "i");
re.test(input);Limits
- 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.
Postal codes for other countries
- Argentine postal code (CPA)
- Australian postcode
- Brazilian postal code (CEP)
- Canadian postal code
- Czech postal code (PSČ)
- French postal code
- German postal code (PLZ)
- Indian PIN code
- Irish Eircode
- Japanese postal code
- Polish postal code
- Portuguese postal code
- Spanish postal code
- Swedish postal code
- Swiss postal code (PLZ/NPA)
- UK postcode
- US ZIP code (ZIP and ZIP+4)
- All postal codes by country