Regex Numéro PPS irlandais (Personal Public Service)
Un numéro PPS a 7 chiffres, une lettre de contrôle (A à W) et, facultativement, une seconde lettre. D'après la spécification DG TAXUD, la lettre de contrôle est dans [A-W] et la seconde lettre dans [A-I] ou « W ». La clé est un modulo 23 : les 7 chiffres sont pondérés 8 à 2 (le premier chiffre par 8) et la seconde lettre, si elle est présente, vaut 1 à 9 avec le poids 9 (« W » ou absence valant 0) ; le reste donne la lettre, 0 valant « W », 1 valant « A », jusqu'à 22 pour « V ». Une regex ne calcule pas ce modulo : elle borne la forme. Les trois tentatives réelles relues divergent sur la seconde lettre : l'une accepte tout caractère de mot, une autre ajoute des lettres historiques, la troisième ajoute des lettres historiques sans ancres de chaîne.
/^\d{7}[A-W][A-IW]?$/Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| validator.js isTaxID (en-IE, drapeau i) — même structure que le motif recommandé mais insensible à la casse : « 1234567tw » passe | ^\d{7}[A-W][A-IW]{0,1}$ | 25 / 26 | sûr |
| Relativity aiR (exemple de regex PPS) — « \w{1,2} » : n'importe quel caractère de mot en 8e et 9e position (« 1234567__ », « 12345678 », « 1234567zz » passent), non ancré | \b\d{7}\w{1,2}\b | 20 / 26 | sûr |
| piigex (détecteur ie_pps) — seconde lettre [ABHWTX] : accepte les lettres historiques T et X (« 1234567TX », « 1234567TT ») que la spécification DG TAXUD ne liste pas ; lookarounds sans ancres de chaîne (« PPS 1234567T » passe) | (?<![A-Za-z0-9])\d{7}[A-W][ABHWTX]?(?![A-Za-z0-9]) | 24 / 26 | sûr |
Implémentation
const re = new RegExp("^\\d{7}[A-W][A-IW]?$", "");
re.test(input);Limites
- Valide seulement la FORME : la lettre de contrôle modulo 23 n'est pas vérifiée. « 1234567A » (la bonne lettre est T) passe. Complément : s = Σ chiffre × (8 − i) pour les 7 chiffres + 9 × rang de la seconde lettre (A=1 … I=9, W ou aucune = 0) ; la lettre attendue est « W » si s % 23 = 0, sinon la lettre de rang s % 23.
- La seconde lettre suit la spécification DG TAXUD ([A-I] ou W). Des lettres historiques « T » et « X » (numéros d'avant 2013, d'après python-stdnum) sont donc refusées : « 6433435FT » est rejeté ; remplacez le groupe par [A-IWTX] si vous devez les accepter. La casse est stricte (majuscules).
- Ne dit rien de l'attribution du numéro (un PPS est une donnée personnelle) ; n'utilisez en test que les numéros d'exemple du document officiel ou synthétiques.