Regex Australian ABN (business number)
An ABN (Australian Business Number) has 11 digits, written '51 824 753 556': two check digits followed by a 9-digit identifier. The ABR describes the check: subtract 1 from the first digit, multiply the 11 digits by weights 10 1 3 5 7 9 11 13 15 17 19, and the sum must be divisible by 89. A regex cannot do that calculation, but it fixes the shape. The patterns read here each accept only one writing (compact for django-localflavor, spaced for Presidio) and the Presidio ones are unanchored. Here's a pattern accepting both usual writings, compared against those attempts.
/^(?:[0-9]{11}|[0-9]{2} [0-9]{3} [0-9]{3} [0-9]{3})$/passes 24/24 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
const re = new RegExp("^(?:[0-9]{11}|[0-9]{2} [0-9]{3} [0-9]{3} [0-9]{3})$", "");
re.test(input);Limits
- 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.