Regex NIF portugais (número de identificação fiscal)
Le NIF des personnes physiques est un numéro à 9 chiffres : les huit premiers sont séquentiels et le dernier est un chiffre de contrôle (décret-loi 14/2013, article 4, et note de l'Autoridade Tributária e Aduaneira). Le premier chiffre d'une personne physique va de 1 à 4, « 45 » désignant des non-résidents ; les NIF de personnes morales commencent par 5, 6, 7, 8 ou 9. La clé se calcule en pondérant les huit premiers chiffres 9, 8, 7, 6, 5, 4, 3, 2 : 11 moins le reste modulo 11, avec 10 et 11 ramenés à 0 (spécification DG TAXUD). Une regex ne l'exprime pas : elle vérifie 9 chiffres sans zéro initial, et il faut ajouter le contrôle de code. Les tentatives réelles relues divergent sur le zéro initial, le préfixe « PT » et les espaces entre groupes de 3 chiffres.
/^[1-9]\d{8}$/Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js isTaxID (pt-PT) — ancrée mais « \d{9} » accepte un zéro initial (« 012345674 » à clé valide) que la loi exclut | ^\d{9}$ | 22 / 24 | sûr |
| piigex (détecteur pt_nif) — premier chiffre 1-9, mais pas d'ancres de chaîne : « NIF 299999998 » et « x-299999998 » passent | (?<!\d)[1-9]\d{8}(?!\d) | 21 / 24 | sûr |
| pii-extract-plg-regex (mode verbeux re.X, espaces retirés) — accepte « PT » et 3 groupes de 3 chiffres, mais zéro initial accepté et non ancrée (« xx299999998yy » passe) | (?:PT\x20?)?(?:\d{3}\x20\d{3}\x20\d{3}|\d{9}) | 17 / 24 | sûr |
Implémentation
const re = new RegExp("^[1-9]\\d{8}$", "");
re.test(input);Limites
- Valide seulement la FORME : 9 chiffres, premier chiffre non nul. La clé modulo 11 n'est pas vérifiée : « 299999999 » et « 501964842 » passent. Complément : somme = Σ chiffre[i] × (9 − i) pour i de 0 à 7, clé = 11 − somme % 11, ramenée à 0 si elle vaut 10 ou 11.
- Les préfixes valides ne sont pas bornés : la loi donne 1 à 4 pour les personnes physiques (« 45 » non-résidents) mais les préfixes 5 à 9 des personnes morales viennent de sources secondaires, donc un NIF commençant par 4 autre que 45, ou par 8, est accepté.
- Le préfixe « PT » (forme TVA) et les espaces entre groupes sont rejetés : retirez-les avant de valider. Ne vérifie ni l'attribution ni l'existence du contribuable ; n'utilisez en test que des numéros d'exemple ou synthétiques.