Rexact
Cheatsheet

Regex Swiss postal code (PLZ/NPA)

A Swiss PLZ (NPA in French) has 4 digits, from 1000 to 9658 according to the official swisstopo directory (January 2026), the highest being Wildhaus (9658). Liechtenstein shares this system: its codes, 9485 to 9498, fall inside the Swiss space, so any '4 digits' regex accepts Vaduz (9490) as Swiss. A W3C editor posted in 2011 a range from 1000 to 9659, with an off-by-one upper bound. A one-vote Stack Overflow answer even accepts a 5-digit code, because it also serves Germany. Here's a pattern with the official bounds that excludes Liechtenstein, compared against those real attempts.

/^(?!94(?:8[5-9]|9[0-8]))(?:[1-8][0-9]{3}|9[0-5][0-9]{2}|96(?:[0-4][0-9]|5[0-8]))$/
passes 23/23 cases

Comparison of existing patterns

Implementation

const re = new RegExp("^(?!94(?:8[5-9]|9[0-8]))(?:[1-8][0-9]{3}|9[0-5][0-9]{2}|96(?:[0-4][0-9]|5[0-8]))$", "");
re.test(input);

Limits

  • Valide seulement la FORME (4 chiffres de 1000 à 9658, hors bloc du Liechtenstein) : ne vérifie pas qu'un NPA est réellement attribué par la Poste suisse. Le répertoire swisstopo compte 3 190 NPA distincts : « 9999 » est exclu, mais bien d'autres codes à l'intérieur de la plage ne sont pas attribués.
  • La borne haute 9658 (Wildhaus) vient du répertoire officiel de janvier 2026 : si la Poste suisse attribue un jour un code supérieur, ce motif le rejettera à tort. À revérifier avant de dépendre de cette borne sur un produit à long terme.
  • Exclut le bloc 9485 à 9498, qui correspond aux codes du Liechtenstein dans le répertoire officiel (Vaduz 9490, Planken 9498) : retirez le lookahead « (?!94…) » si votre formulaire accepte aussi les adresses du Liechtenstein, qui partage le système postal suisse.
  • Ne couvre pas les enclaves de Campione d'Italia (6911) et de Büsingen (8238), citées par Wikipédia mais absentes du répertoire swisstopo consulté : un code qui commence à 6911 passe ce motif sans être confirmé par cette source.

Postal codes for other countries

Related pages