Rexact
Cheatsheet

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

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.