Regex Singapore NRIC / FIN
An NRIC (citizens and permanent residents) or FIN (foreigners on long-term passes) is written @xxxxxxx#: a series letter (S or T for NRIC, F, G or M for FIN), seven digits and a check letter. Series S, T, F, G do not share check letters: JZIHGFEDCBA for S and T, XWUTRQPNMLK for F and G, according to the implementations read (the algorithm is not officially published). The three patterns read here accept any A-Z final letter: 'S1234567K' (a FIN-series letter) passes. Here's a pattern restricting the check letter by series, compared against those attempts.
/^(?:[ST][0-9]{7}[A-JZ]|[FG][0-9]{7}[K-NP-RTUWX]|M[0-9]{7}[JKLNPQRTUWX])$/passes 25/25 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
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);Limits
- 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.