Regex Hong Kong identity card number (HKID)
An HKID number is written X123456(A): one or two letters, six digits and a check character, a digit or 'A', usually in parentheses (which are not part of the number and only ease computer processing, according to Wikipedia). The check is a modulo 11 on characters weighted 9 to 2 (A to Z are 10 to 35, a one-letter number is preceded by a space). The three patterns read here handle parentheses differently: validator.js also accepts square brackets, the hkid package uppercases the input before its regex, and validid only accepts the bare form. Here's a pattern accepting both usual writings, compared against those attempts.
/^[A-Z]{1,2}[0-9]{6}(?:[0-9A]|\([0-9A]\))$/passes 24/24 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
const re = new RegExp("^[A-Z]{1,2}[0-9]{6}(?:[0-9A]|\\([0-9A]\\))$", "");
re.test(input);Limits
- 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.