Regex numéro de carte d'identité de Hong Kong (HKID)
Un numéro HKID s'écrit X123456(A) : une ou deux lettres, six chiffres et une clé, un chiffre ou « A », en général entre parenthèses (celles-ci ne font pas partie du numéro et servent à faciliter le traitement informatique, d'après Wikipédia). La clé est un modulo 11 sur les caractères pondérés de 9 à 2 (A à Z valent 10 à 35, un numéro à une lettre est précédé d'un espace). Les trois motifs relus ici traitent différemment les parenthèses : validator.js accepte aussi les crochets, le paquet hkid met l'entrée en majuscules avant sa regex, et validid n'accepte que la forme sans parenthèses. Voici un motif qui accepte les deux écritures usuelles, comparé à ces tentatives.
/^[A-Z]{1,2}[0-9]{6}(?:[0-9A]|\([0-9A]\))$/passe 24/24 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js isIdentityCard('zh-HK') — accepte aussi les crochets « A123456[3] », que Wikipédia ne mentionne pas ; la regex s'applique après passage en majuscules dans le code | ^[A-Z]{1,2}[0-9]{6}((\([0-9A]\))|(\[[0-9A]\])|([0-9A]))$ | 23 / 24 | sûr |
| hkid (npm) — regex en chaîne, appliquée à l'entrée mise en majuscules ; accepte « A123456(3) » et « A1234563 », sans crochets : proche du motif recommandé | ^([A-Z]{1,2})([0-9]{6})(([0-9A])|\(([0-9A])\))$ | 24 / 24 | sûr |
| validid (npm), HKID_PATTERN — refuse la forme usuelle avec parenthèses « A123456(3) » ; exclut la lettre O partout (y compris en 2e position), ce qu'aucune source lue ne justifie | ^[A-NP-Z]{1,2}[0-9]{6}[0-9A]$ | 19 / 24 | sûr |
Implémentation
const re = new RegExp("^[A-Z]{1,2}[0-9]{6}(?:[0-9A]|\\([0-9A]\\))$", "");
re.test(input);Limites
- Valide seulement la FORME : ne calcule pas la clé modulo 11. « A123456(4) » a la bonne forme mais une clé fausse et passe ; le calcul se fait dans le code.
- Source de l'algorithme et du format : secondaire (Wikipédia, bibliothèque Perl, implémentations). Je n'ai pas ouvert de document de l'Immigration Department ; vérifiez sur des numéros réels de votre domaine avant de durcir.
- N'importe quelle lettre est acceptée en tête, alors que Wikipédia indique qu'aucun numéro à une lettre ne commence par I, O, Q, U ou X en 2023 ; le sens des lettres initiales (période, bureau) n'est pas contrôlé. Majuscules seulement, parenthèses facultatives mais appariées.
- N'établit pas qu'une carte a été délivrée. Un HKID est une donnée personnelle : n'utilisez que des numéros synthétiques à clé calculée.