Rexact
Cheatsheet

Regex Canadian SIN

A Canadian SIN isn't just "9 digits": regulation SOR/2013-82 states that numbers starting with "9" are reserved for temporary residents, and a Luhn check digit validates the whole. A regex republished on regexpattern.com contains a classic | operator precedence bug, which actually makes the start and end anchors independent of each other - a number surrounded by stray text passes validation. Here's a pattern enforcing a consistent separator (hyphen or space, never mixed), compared against that buggy attempt and two others.

/^(\d{3})([-\s]?)(\d{3})\2(\d{3})$/
passes 21/21 cases

Comparison of existing patterns

Implementation

const re = new RegExp("^(\\d{3})([-\\s]?)(\\d{3})\\2(\\d{3})$", "");
re.test(input);

Limits

  • Valide seulement la FORME (9 chiffres, séparateur cohérent) : ne calcule pas la clé de contrôle de Luhn — un NAS syntaxiquement valide selon ce motif peut échouer ce calcul et ne correspondre à aucune personne réelle (voir 123-456-789 ou 046-454-287 dans les exemples, tous deux structurellement valides mais faux à la clé).
  • Le tableau associant le 1er chiffre à une province ou un territoire d'émission, largement repris en ligne, n'est pas confirmé par une page canada.ca actuelle trouvée lors de la rédaction de cette fiche — volontairement omis plutôt qu'affirmé sans source officielle solide. Seule la règle « 9 = résident temporaire » est doublement confirmée (règlement DORS/2013-82 et page canada.ca dédiée).
  • Ne consulte aucun registre d'Emploi et Développement social Canada : seule une vérification auprès de cet organisme confirme qu'un NAS est réellement attribué et actif.
  • N'autorise qu'un seul type de séparateur pour tout le numéro (uniquement des tirets, ou uniquement des espaces, jamais mélangés) : plusieurs bibliothèques réelles comparées ici acceptent à tort un mélange incohérent des deux.