Rexact
Cheatsheet

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

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.

Pages liées