Regex NINO britannique
Un NINO, ce n'est pas juste « 2 lettres + 6 chiffres + 1 lettre » : certaines lettres sont interdites en 1ère ou 2ème position, et 7 préfixes complets sont réservés. Fait amusant : le préfixe « QQ » utilisé dans l'exemple officiel gov.uk (« QQ 123456 C ») viole lui-même cette règle — Q étant exclu des deux positions, ce préfixe ne pourra jamais être un vrai NINO, un choix probablement délibéré pour qu'il ne collisionne jamais avec un numéro réel. Plus surprenant encore : la propre bibliothèque Java du gouvernement britannique (DWP) utilise une syntaxe d'intersection de classes de caractères (« [A-Z&&[^DFIQUV]] ») propre à Java — copiée telle quelle en JavaScript, elle ne provoque aucune erreur mais matche silencieusement autre chose. Voici un motif qui applique correctement toutes les règles, comparé à cette regex officielle piégée et deux autres tentatives.
/^(?!BG|GB|KN|NK|NT|TN|ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z][0-9]{6}[A-D]$/Comparatif des patterns existants
| Source | pattern | Score sur le 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 | sûr |
| 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 | sûr |
| 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 | sûr |
Implémentation
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);Limites
- 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.