Regex numéro de routage ABA
Un numéro de routage ABA, ce n'est pas juste « 9 chiffres commençant par un préfixe régional valide » : une somme pondérée (poids 3-7-1 répétés) doit être divisible par 10. Une regex publiée sur RegexLib, notée 5 étoiles sur 5, se contente du préfixe — et voici la preuve la plus parlante possible : ses propres exemples de numéros « valides » documentés sur la page (614321634, 114000900, 703452098) échouent tous les trois au vrai calcul de contrôle, vérifié indépendamment. Une bonne note ne garantit rien. Voici un motif qui se limite honnêtement à ce qu'une regex peut vérifier ici, comparé à cette tentative et deux autres.
/^[0-9]{9}$/passe 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| RegexLib (noté 5/5 étoiles) — se limite au préfixe régional, jamais au calcul de contrôle ; ses propres exemples « valides » documentés sur la page échouent tous au vrai calcul, vérifié indépendamment | ^((0[0-9])|(1[0-2])|(2[1-9])|(3[0-2])|(6[1-9])|(7[0-2])|80)([0-9]{7})$ | 19 / 20 | sûr |
| Stack Overflow (2 votes) — exclut seulement le chiffre 5 en tête, sans aucune vérification de somme de contrôle ; la question elle-même naît d'une confusion sur un numéro réel de Bank of America | ^[012346789][0-9]{8}$ | 20 / 20 | sûr |
| Stack Overflow — autorise à tort le préfixe 00 (district inexistant), oublie les préfixes valides 61-72 et 80, et ne vérifie toujours pas le chiffre de contrôle | ^(?=(?:[0][0-9]|1[0-2])|21|22|23|24|25|26|27|28|29|30|31|32)\d{9}$ | 18 / 20 | sûr |
Implémentation
const re = new RegExp("^[0-9]{9}$", "");
re.test(input);Limites
- Valide seulement la FORME (9 chiffres) : ne calcule pas la somme pondérée 3-7-1 qui constitue le vrai chiffre de contrôle — un numéro syntaxiquement valide selon ce motif peut échouer ce calcul et ne correspondre à aucune institution réelle (voir 123456789, 999999999 et 021000020 dans les exemples, tous structurellement valides mais faux à la clé).
- Ne consulte pas le registre officiel tenu par Accuity/LexisNexis Risk Solutions pour le compte de l'ABA : seule cette source confirme qu'un numéro est réellement attribué à une institution active.
- N'exclut aucun préfixe régional obsolète ou jamais attribué : contrairement à ce qu'une regex par plage de préfixe pourrait laisser croire, une plage syntaxiquement plausible n'a jamais garanti qu'un district existe réellement à ce jour.
- Ne distingue pas un numéro de routage ABA (établissements bancaires américains) d'un numéro à 9 chiffres d'un tout autre système (SIREN français, par exemple) : la forme seule, 9 chiffres, est insuffisante pour identifier le système dont provient un numéro isolé de son contexte.