Regex ABN australien (numéro d'entreprise)
Un ABN (Australian Business Number) a 11 chiffres, écrits « 51 824 753 556 » : deux chiffres de clé suivis d'un identifiant à 9 chiffres. Le registre ABR décrit le contrôle : on retire 1 au premier chiffre, on multiplie les 11 chiffres par les poids 10 1 3 5 7 9 11 13 15 17 19, et la somme doit être divisible par 89. Une regex ne peut pas faire ce calcul, mais elle fixe la forme. Les motifs relus ici n'acceptent chacun qu'une écriture (compacte pour django-localflavor, avec espaces pour Presidio) et ceux de Presidio ne sont pas ancrés. Voici un motif qui accepte les deux écritures usuelles, comparé à ces tentatives.
/^(?:[0-9]{11}|[0-9]{2} [0-9]{3} [0-9]{3} [0-9]{3})$/passe 24/24 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| django-localflavor (au/validators.py) — ancrée mais n'accepte que la forme compacte : « 51 824 753 556 » (écriture officielle de l'ABR) est refusé | ^\d{11}$ | 19 / 24 | sûr |
| Presidio, motif « ABN (Medium) » — n'accepte que la forme avec espaces, \s laisse passer tabulations et retours à la ligne, non ancré : « ABN 51 824 753 556 » passe | \b\d{2}\s\d{3}\s\d{3}\s\d{3}\b | 16 / 24 | sûr |
| Presidio, motif « ABN (Low) » — 11 chiffres par \b, non ancré : « ref:51824753556! » passe, la forme avec espaces est refusée | \b\d{11}\b | 19 / 24 | sûr |
Implémentation
const re = new RegExp("^(?:[0-9]{11}|[0-9]{2} [0-9]{3} [0-9]{3} [0-9]{3})$", "");
re.test(input);Limites
- Valide seulement la FORME : ne fait pas le modulo 89. « 51 824 753 557 » a la bonne forme mais ne passe pas le contrôle de l'ABR, et ce motif l'accepte ; faites le calcul dans le code (poids de la page de l'ABR).
- N'établit pas que l'ABN est actif ni qu'il correspond à une entreprise : seule une recherche dans ABN Lookup le dit. Le motif ne couvre pas l'ACN (9 chiffres) ni le TFN, qui sont d'autres identifiants.
- Seul l'espace simple sépare les groupes (écriture officielle) : tirets, points et tabulations sont refusés, normalisez avant.