Regex UK NINO
A NINO isn't just "2 letters + 6 digits + 1 letter": certain letters are banned in 1st or 2nd position, and 7 full prefixes are reserved. Fun fact: the "QQ" prefix used in gov.uk's own official example ("QQ 123456 C") actually breaks that very rule - Q being banned from both positions, that prefix can never be a real NINO, likely a deliberate choice so it never collides with an actual number. Even more surprising: the UK government's own Java library (DWP) uses a character-class intersection syntax ("[A-Z&&[^DFIQUV]]") specific to Java - copied as-is into JavaScript, it throws no error but silently matches something else. Here's a pattern correctly applying every rule, compared against that trapped official regex and two other attempts.
/^(?!BG|GB|KN|NK|NT|TN|ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z][0-9]{6}[A-D]$/passes 21/21 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Implémentation Java officielle du gouvernement britannique (DWP, uk.gov.dwp.regex.NinoValidator) — utilise une intersection de classes propre à Java, silencieusement invalide une fois réutilisée telle quelle en JavaScript | (^(?!BG)(?!GB)(?!NK)(?!KN)(?!TN)(?!NT)(?!ZZ)[A-Z&&[^DFIQUV]][A-Z&&[^DFIOQUV]][0-9]{6}[A-D]$) | 17 / 21 | safe |
| RegExLib.com #527 (noté 5/5 étoiles) — aucune exclusion des 7 préfixes réservés, accepte à tort F et M comme lettre finale, et rend cette lettre finale totalement optionnelle | ^[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-DFM]{0,1}$ | 17 / 21 | safe |
| regex101.com (3 votes) — les classes négées n'excluent que les lettres listées sans se restreindre aux lettres A-Z, un chiffre ou symbole en 1ère/2ème position passe | ^(?!BG|GB|KN|NK|NT|TN|ZZ)[^DFIQUV][^DFIQUVo][0-9]{6}[ABCD]$ | 18 / 21 | safe |
Implementation
const re = new RegExp("^(?!BG|GB|KN|NK|NT|TN|ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z][0-9]{6}[A-D]$", "");
re.test(input);Limits
- Valide seulement la FORME (lettres autorisées, préfixes réservés exclus, 6 chiffres, lettre finale A-D) : ne consulte pas les registres HMRC pour confirmer qu'un NINO est réellement attribué à une personne.
- Certaines combinaisons de préfixe restent réservées à des usages spécifiques (temporaires, administratifs) au-delà des 7 exclues ici : la page HMRC détaillant la liste complète (NIM39115) est elle-même retirée de la publication pour raisons réglementaires, seule NIM39110 reste exploitable publiquement.
- Exige une chaîne sans espace ni tiret : la présentation à l'affichage groupée par paires (« QQ 12 34 56 C ») doit être retirée avant validation par ce motif.
- Un NINO peut être suivi ou précédé d'espaces dans un formulaire de saisie libre sans que cela invalide la vraie donnée sous-jacente : ce motif exige une correspondance exacte de bout en bout, sans tolérance de bordure.
- L'exemple canonique publié par gov.uk lui-même (« QQ 12 34 56 A ») ne passe pas ce motif : le préfixe « QQ » viole la règle qu'il est censé illustrer (Q exclu des deux premières positions) — probablement un choix délibéré pour qu'un exemple de documentation ne puisse jamais correspondre à un NINO réellement attribuable.