Regex Indian PIN code
An Indian PIN code has 6 digits, the first from 1 to 9. A Drupal module had a regex where '[1-9]{3}' required the first three digits to be non-zero: '110001' (Connaught Place, Delhi) was rejected, a bug reported in 2008. Its fix, reused by GeeksforGeeks, now accepts '111111' and '100000', codes that do not exist: only about 19,584 of the 900,000 possible PINs are assigned. Here's a pattern that also excludes the two-digit prefixes never used (10, 29, 35, 54, 55, 65, 66, 86 to 89), compared against those real attempts.
/^(?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{2} ?[0-9]{3}$/passes 22/22 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| GeeksforGeeks — « \s » accepte une tabulation, et aucune exclusion de préfixe : « 111111 », « 123456 » et « 100000 » (préfixe 10 jamais utilisé) passent | ^[1-9]{1}[0-9]{2}\s{0,1}[0-9]{3}$ | 20 / 22 | safe |
| Drupal (module CCK Address Extensions, ticket #235786) — bug d'origine : « [1-9]{3} » exige trois premiers chiffres non nuls, donc « 110001 » (Delhi), « 400001 » (Bombay) et « 560001 » (Bangalore) sont rejetés | ^[1-9]{3}\s{0,1}[0-9]{3}$ | 15 / 22 | safe |
| validator.js — exclut bien les préfixes jamais utilisés (même liste que le jeu de données de 2019), mais n'accepte aucune espace : « 400 001 » est rejeté ; « 111111 » passe | ^((?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{5})$ | 21 / 22 | safe |
| postcode-validator (npm) — 6 chiffres sans autre vérification : accepte « 000000 » et « 012345 » (zéro initial), et rejette « 400 001 » | ^\d{6}$ | 17 / 22 | safe |
Implementation
const re = new RegExp("^(?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{2} ?[0-9]{3}$", "");
re.test(input);Limits
- Valide seulement la FORME (6 chiffres, premier chiffre 1 à 9, préfixes à deux chiffres connus comme inutilisés exclus) : ne vérifie pas qu'un PIN est réellement attribué. Seuls environ 19 584 des 900 000 combinaisons possibles le sont, d'après le jeu de données data.gov.in de 2019 : « 111111 » passe, alors qu'il n'existe pas.
- Les préfixes exclus (10, 29, 35, 54, 55, 65, 66, 86 à 89) viennent d'un jeu de données de 2019 et correspondent à la liste qu'utilise validator.js : si India Post ouvre un nouveau préfixe, ce motif le rejettera à tort. Le préfixe 9, le service postal de l'armée, est accepté, même si ce jeu de données n'en contient aucun.
- L'espace après le 3e chiffre (« 400 001 ») est une convention d'écriture qu'on trouve sur le web, pas une règle officielle : aucune page d'India Post n'a pu être consultée pour confirmer la forme exacte. Normalisez le code en 6 chiffres collés avant de le stocker.
- N'accepte qu'une seule espace, ASCII, à cet emplacement : « 110 001 » (deux espaces), « 1100 01 » ou une tabulation sont rejetés, contrairement à la regex de GeeksforGeeks qui accepte n'importe quel espace blanc.
Postal codes for other countries
- Argentine postal code (CPA)
- Australian postcode
- Brazilian postal code (CEP)
- Canadian postal code
- Czech postal code (PSČ)
- Dutch postal code
- French postal code
- German postal code (PLZ)
- 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