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
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Gist GitHub (Ajwah) — accepte n'importe quelle suite de 9 chiffres groupés par tirets, y compris 000-000-000, sans aucune vérification de la clé de Luhn | \b\d{3}-\d{3}-\d{3}\b | 16 / 21 | safe |
| Blog Pawel Ciucias (2013) — chaque séparateur (espace ou tiret) est optionnel indépendamment, un format incohérent comme « 123 456-789 » passe | ^\d{3}(\s?|[-]?)\d{3}(\s?|[-]?)\d{3}$ | 19 / 21 | safe |
| regexpattern.com — bug classique de précédence de l'opérateur |, qui rend les ancres de début et de fin indépendantes l'une de l'autre : un texte parasite peut entourer un NAS par ailleurs correct | ^(\d{3}-\d{3}-\d{3})|(\d{9})$ | 16 / 21 | safe |
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.