Rexact
Cheatsheet

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}$/i
passes 26/26 cases

Comparison of existing patterns

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

Related pages