Rexact
Cheatsheet

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

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.

Related pages