Not knowing which language you are using, I will not use abbreviations for character classes:
^[0-9]{5}$|^[AZ][0-9][AZ] ?[0-9][AZ][0-9]$
Depending on your language, you can shorten this to
^([0-9]{5}|[AZ][0-9][AZ] ?[0-9][AZ][0-9])$
or
^(\d{5}|[AZ]\d[AZ] ?\d[AZ]\d)$
To support ZIP + 4:
^(\d{5}(-\d{4})?|[AZ]\d[AZ] ?\d[AZ]\d)$
And if you want to really understand your Canada codes:
^(\d{5}(-\d{4})?|[A-CEGHJ-NPRSTVXY]\d[A-CEGHJ-NPRSTV-Z] ?\d[A-CEGHJ-NPRSTV-Z]\d)$
dg99
source share