Regex Australian postcode
An Australian postcode has 4 digits, but not just any: the allocated blocks are 0200-0299, 0800-0999 and 1000-9999. A Stack Overflow answer (2 votes) lists the ranges by hand and forgets 2915 to 2999 and 7500 to 7799, i.e. 385 codes from valid ranges (ACT, New South Wales, Tasmania). It also anchors only one alternative out of seven, so '20000' passes. A LeadsHook rule has the same anchoring flaw, and the most common one, '^\d{4}$', lets '0000' and '0100' through. Here's an anchored pattern following Australia Post's blocks, compared against those real attempts.
/^(?:0[289][0-9]{2}|[1-9][0-9]{3})$/passes 28/28 cases
Comparison of existing patterns
| Source | pattern | Score on the corpus | ReDoS |
|---|---|---|---|
| Stack Overflow (2 votes) — plages énumérées à la main : oublie 2915-2999 et 7500-7799 (385 codes de plages attribuées) ; « ^ » et « $ » ne lient qu'une alternative chacun, « 20000 » passe | ^(0[289][0-9]{2})|([1345689][0-9]{3})|(2[0-8][0-9]{2})|(290[0-9])|(291[0-4])|(7[0-4][0-9]{2})|(7[8-9][0-9]{2})$ | 21 / 28 | safe |
| LeadsHook (article d'aide) — mêmes ancres mal liées : « 12345 », « -2000 » et « +2000 » passent ; seule logique de plage : le premier chiffre | ^(0[289][0-9]{2})|([123456789][0-9]{3})$ | 26 / 28 | safe |
| django-localflavor (AUPostCodeField) — 4 chiffres sans plage : « 0000 », « 0100 », « 0199 », « 0300 » et « 0799 », sans bloc attribué, passent | ^\d{4}$ | 23 / 28 | safe |
| LimeSurvey (manuel) — pas d'ancre de fin : « 20000 », « 12345 » et « 2000 » suivi d'une espace passent | ^[0-9]{4} | 21 / 28 | safe |
Implementation
const re = new RegExp("^(?:0[289][0-9]{2}|[1-9][0-9]{3})$", "");
re.test(input);Limits
- Valide seulement la FORME (4 chiffres dans un bloc attribué) : ne vérifie pas qu'un code est réellement utilisé. Les blocs d'Australia Post sont des plages attribuées, pas la liste des codes en service ; seul un fichier de correspondance code-localité confirme l'existence d'un code.
- Wikipédia et Australia Post divergent d'une unité sur la limite entre l'ACT et la Nouvelle-Galles du Sud (2618 ou 2619) : sans conséquence ici, ce motif accepte tout 2600 à 2999, mais à connaître si vous distinguez les deux territoires.
- Les codes 0200-0299 (ACT) et 0900-0999 sont acceptés, mais selon Wikipédia une partie de ces plages est réservée aux boîtes postales et aux gros clients : un code accepté par ce motif n'est pas forcément un code d'adresse de livraison.
- Le zéro initial est significatif (« 0872 » est un vrai code) : stockez le code en texte, pas en entier, sinon il devient « 872 » et échoue à ce motif.
Postal codes for other countries
- Argentine postal code (CPA)
- Brazilian postal code (CEP)
- Canadian postal code
- Czech postal code (PSČ)
- Dutch postal code
- French postal code
- German postal code (PLZ)
- Indian PIN code
- Irish Eircode
- Japanese postal code
- Polish postal code
- Portuguese postal code
- Spanish postal code
- Swedish postal code
- Swiss postal code (PLZ/NPA)
- UK postcode
- US ZIP code (ZIP and ZIP+4)
- All postal codes by country