Regex PIN code indien
Un PIN code indien a 6 chiffres, le premier de 1 à 9. Un module Drupal avait pourtant une regex où « [1-9]{3} » exigeait que les trois premiers chiffres soient non nuls : « 110001 » (Connaught Place, Delhi) était rejeté, le bug a été signalé en 2008. Sa correction, reprise par GeeksforGeeks, accepte maintenant « 111111 » et « 100000 », des codes qui n'existent pas : seuls environ 19 584 des 900 000 PIN possibles sont attribués. Voici un motif qui exclut aussi les préfixes à deux chiffres jamais utilisés (10, 29, 35, 54, 55, 65, 66, 86 à 89), comparé à ces tentatives réelles.
/^(?!10|29|35|54|55|65|66|86|87|88|89)[1-9][0-9]{2} ?[0-9]{3}$/passe 22/22 cas
Comparatif des patterns existants
| Source | pattern | Score sur le 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 | sûr |
| 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 | sûr |
| 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 | sûr |
| postcode-validator (npm) — 6 chiffres sans autre vérification : accepte « 000000 » et « 012345 » (zéro initial), et rejette « 400 001 » | ^\d{6}$ | 17 / 22 | sûr |
Implémentation
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);Limites
- 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.
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 néerlandais
- code postal polonais
- code postal portugais
- code postal suédois
- code postal suisse (NPA)
- code postal tchèque (PSČ)
- Eircode irlandais
- ZIP code américain (ZIP et ZIP+4)
- Tous les codes postaux par pays