Regex NRIC / FIN singapourien
Un NRIC (citoyens et résidents permanents) ou FIN (étrangers titulaires d'un titre de séjour long) s'écrit @xxxxxxx# : une lettre de série (S ou T pour le NRIC, F, G ou M pour le FIN), sept chiffres et une lettre de contrôle. Les séries S, T, F, G ne partagent pas les mêmes lettres de contrôle : JZIHGFEDCBA pour S et T, XWUTRQPNMLK pour F et G, d'après les implémentations lues (l'algorithme n'est pas publié par l'État). Les trois motifs relus ici acceptent n'importe quelle lettre A-Z à la fin : « S1234567K » (une lettre de série FIN) y passe. Voici un motif qui borne la lettre de contrôle selon la série, comparé à ces tentatives.
/^(?:[ST][0-9]{7}[A-JZ]|[FG][0-9]{7}[K-NP-RTUWX]|M[0-9]{7}[JKLNPQRTUWX])$/passe 25/25 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| django-localflavor (sg/forms.py) — ancrée mais n'importe quelle lettre finale (« S1234567K ») ; n'accepte pas la série M | ^[SFTG](\d{7})[A-Z]$ | 21 / 25 | sûr |
| Presidio (sg_fin_recognizer), motif « Nric (medium) » — détection insensible à la casse et non ancrée (\b) : « id:S1234567D » et « s1234567d » passent | (\b[STFGM][0-9]{7}[A-Z]\b) | 18 / 25 | sûr |
| singapore-nric (npm) — ancrée, série M acceptée, mais n'importe quelle lettre finale (« F1234567A ») ; le checksum est vérifié ensuite dans le code | ^[STFGM]\d{7}[A-Z]$ | 21 / 25 | sûr |
Implémentation
const re = new RegExp("^(?:[ST][0-9]{7}[A-JZ]|[FG][0-9]{7}[K-NP-RTUWX]|M[0-9]{7}[JKLNPQRTUWX])$", "");
re.test(input);Limites
- Valide seulement la FORME et la lettre de contrôle possible pour la série : ne calcule pas la lettre exacte. « S1234567A » est une lettre possible pour la série S mais pas la bonne, et passe ; le calcul (poids, offset, modulo 11) se fait dans le code.
- L'algorithme n'est pas publié officiellement : les tables viennent d'implémentations tierces (django-localflavor pour S, T, F, G ; deux paquets npm pour M, singapore-nric et nric). Retirez la branche M si vous n'en avez pas besoin.
- Majuscules seulement. Le sens de la lettre initiale (date de naissance ou d'attribution) n'est pas contrôlé, ni l'existence du numéro.
- Un NRIC est une donnée personnelle sensible, et la loi singapourienne encadre sa collecte : n'utilisez que des exemples synthétiques, comme ceux du corpus.