Skip to content

Instantly share code, notes, and snippets.

@Gyvastis
Last active October 14, 2020 10:01
Show Gist options
  • Save Gyvastis/feb3f0a97494258928a601dab2b0ab7c to your computer and use it in GitHub Desktop.
Save Gyvastis/feb3f0a97494258928a601dab2b0ab7c to your computer and use it in GitHub Desktop.
Global ZipCode regexes
package helpers
import (
"errors"
"fmt"
"regexp"
)
type ZipCode struct{}
var zipCodeRegexes = map[string]string{
"AC": "^(ASCN 1ZZ)$",
"AD": "^(?:AD)*(\\d{3})$",
"AE": "",
"AF": "^(\\d{4})$",
"AG": "^(\\d{5})$",
"AI": "^(AI-2640)$",
"AL": "^(\\d{4})$",
"AM": "^(\\d{4})$",
"AN": "",
"AO": "",
"AQ": "^(7151)$",
"AR": "^([A-Z]\\d{4}[A-Z]{3})|([A-Z]?\\d{4})$",
"AS": "^(\\d{5})$",
"AT": "^(\\d{4})$",
"AU": "^(\\d{4})$",
"AW": "^(0000 AW)$",
"AX": "^(\\d{5})$",
"AZ": "^(AZ) (\\d{4})$",
"BA": "^(\\d{5})$",
"BB": "^(?:BB)*(\\d{5})$",
"BD": "^(\\d{4})$",
"BE": "^(\\d{4})$",
"BF": "",
"BG": "^(\\d{4})$",
"BH": "^(\\d{3}\\d?)$",
"BI": "",
"BJ": "",
"BL": "^(\\d{5})$",
"BM": "^([A-Z]{2} \\d{2})$",
"BN": "^([A-Z]{2}\\d{4})$",
"BO": "",
"BQ": "^(0000 BQ)$",
"BR": "^[0-9]{5}-[0-9]{3}$",
"BS": "",
"BT": "^(\\d{5})$",
"BV": "",
"BW": "",
"BY": "^(\\d{6})$",
"BZ": "",
"CA": "^(?!.*[DFIOQU])[A-VXY][0-9][A-Z] +?[0-9][A-Z][0-9]$",
"CC": "^(6799 W3)$",
"CD": "",
"CF": "",
"CG": "",
"CH": "^(\\d{4})$",
"CI": "",
"CK": "",
"CL": "^(\\d{7})$",
"CM": "",
"CN": "^(\\d{6})$",
"CO": "^(\\d{6})$",
"CR": "^(\\d{5})$",
"CU": "^(?:CP)*(\\d{5})$",
"CV": "^(\\d{4})$",
"CW": "^(0000 CW)$",
"CX": "^(6978)$",
"CY": "^(\\d{4})$",
"CZ": "^[0-9]{3} [0-9]{2}$",
"DE": "^(\\d{5})$",
"DJ": "",
"DK": "^(\\d{4})$",
"DM": "",
"DO": "^(\\d{5})$",
"DZ": "^(\\d{5})$",
"EC": "^(\\d{6})$",
"EE": "^(\\d{5})$",
"EG": "^(\\d{5})$",
"EH": "^(\\d{5})$",
"ER": "",
"ES": "^(\\d{5})$",
"ET": "^(\\d{4})$",
"FI": "^(?:FI)*(\\d{5})$",
"FJ": "",
"FK": "^(FIQQ 1ZZ)$",
"FM": "^(\\d{5})$",
"FO": "^(?:FO)*(\\d{3})$",
"FR": "^(\\d{5})$",
"GA": "",
"GB": "^(((([A-PR-UWYZ][0-9][0-9A-HJKS-UW]?)|([A-PR-UWYZ][A-HK-Y][0-9][0-9ABEHMNPRV-Y]?))\\s{0,2}[0-9]([ABD-HJLNP-UW-Z]{2}))|(GIR\\s{0,2}0AA))$",
"GD": "",
"GE": "^(\\d{4})$",
"GF": "^((973)\\d{2})$",
"GG": "((GY)([0-9][0-9A-HJKPS-UW]?|[A-HK-Y][0-9][0-9ABEHMNPRV-Y]?) [0-9][ABD-HJLNP-UW-Z]{2})",
"GH": "",
"GI": "^(GX11 1AA)$",
"GL": "^(\\d{4})$",
"GM": "",
"GN": "^(\\d{3})$",
"GP": "^((971)[0-9][0-0])$",
"GQ": "",
"GR": "^(\\d{3}) \\d{2}$",
"GS": "^(SIQQ 1ZZ)$",
"GT": "^(\\d{5})$",
"GU": "^((969)[1-3][0-2])$",
"GW": "^(\\d{4})$",
"GY": "",
"HK": "^(999077)$",
"HM": "^(7151)$",
"HN": "^(\\d{5})$",
"HR": "^(?:HR)*(\\d{5})$",
"HT": "^(?:HT)*(\\d{4})$",
"HU": "^(\\d{4})$",
"ID": "^(\\d{5})$",
"IE": "^[A-NP-Z\\d]{3}\\s[A-NP-Z\\d]{4}",
"IL": "^(\\d{5})$",
"IM": "((IM)([0-9][0-9A-HJKPS-UW]?|[A-HK-Y][0-9][0-9ABEHMNPRV-Y]?) [0-9][ABD-HJLNP-UW-Z]{2})",
"IN": "^(\\d{6})$",
"IO": "^(BB9D 1ZZ)$",
"IQ": "^(\\d{5})$",
"IR": "^\\d{5}([\\-]\\d{5})?$",
"IS": "^(\\d{3})$",
"IT": "^(\\d{5})$",
"JE": "(JE)([0-9]\\d{1})",
"JM": "^((JM)[A-Z]{3,3}\\d{2,2})$",
"JO": "^(\\d{5})$",
"JP": "^(\\d{3}-\\d{4})$",
"KE": "^(\\d{5})$",
"KG": "^(\\d{6})$",
"KH": "^(\\d{5})$",
"KI": "",
"KM": "",
"KN": "",
"KP": "",
"KR": "^(\\d{3}[-]\\d{3})$",
"KW": "^(\\d{5})$",
"KY": "^[K][Y][0-9]{1}[-]([0-9]){4}$",
"KZ": "^(\\d{6})$",
"LA": "^(\\d{5})$",
"LB": "^(\\d{4}(\\d{4})?)$",
"LC": "",
"LI": "^(\\d{4})$",
"LK": "^(\\d{5})$",
"LR": "^(\\d{4})$",
"LS": "^(\\d{3})$",
"LT": "^(?:LT)*(\\d{5})$",
"LU": "^(\\d{4})$",
"LV": "^[L]{1}[V]{1}[-]([0-9]){4}$",
"LY": "^(\\d{5})$",
"MA": "^(\\d{5})$",
"MC": "^(\\d{5})$",
"MD": "^(?:MD)*(\\d{4})$",
"ME": "^(\\d{5})$",
"MF": "^(\\d{5})$",
"MG": "^(\\d{3})$",
"MH": "^((969)[6-7][0-9])$",
"MK": "^(\\d{4})$",
"ML": "",
"MM": "^(\\d{5})$",
"MN": "^(\\d{5})$",
"MO": "",
"MP": "^(\\d{5})$",
"MQ": "^(\\d{5})$",
"MR": "",
"MS": "",
"MT": "^[A-Z]{3} [0-9]{4}$",
"MU": "^([0-9A-Z]\\d{4})$",
"MV": "^(\\d{5})$",
"MW": "",
"MX": "^(\\d{5})$",
"MY": "^(\\d{5})$",
"MZ": "^(\\d{4})$",
"NA": "",
"NC": "^(\\d{5})$",
"NE": "^(\\d{4})$",
"NF": "^(2899)$",
"NG": "^(\\d{6})$",
"NI": "^(\\d{5})$",
"NL": "[0-9]{4} ?[A-Z]{2}",
"NO": "^(\\d{4})$",
"NP": "^(\\d{5})$",
"NR": "",
"NU": "",
"NZ": "^(\\d{4})$",
"OM": "^(\\d{3})$",
"PA": "",
"PE": "^(\\d{5})$",
"PF": "^((987)\\d{2})$",
"PG": "^(\\d{3})$",
"PH": "^(\\d{4})$",
"PK": "^(\\d{5})$",
"PL": "^[0-9]{2}[-]([0-9]){3}$",
"PM": "^(\\d{5})$",
"PN": "^(PCR9 1ZZ)$",
"PR": "^\\d{5}((-|\\s)?\\d{4})?$",
"PS": "^(\\d{5})$",
"PT": "^\\d{4}((-|\\s)?\\d{3})?$",
"PW": "^(96940)$",
"PY": "^(\\d{4})$",
"QA": "",
"RE": "[9]{1}[7|8][4|7|8]\\d{2}",
"RO": "^(\\d{6})$",
"RS": "^(\\d{5})$",
"RU": "^(\\d{6})$",
"RW": "",
"SA": "^(\\d{5})$",
"SB": "",
"SC": "",
"SD": "^(\\d{5})$",
"SE": "^(\\d{3} \\d{2})$",
"SG": "^(\\d{6})$",
"SH": "^[A-Z]{4} (1ZZ)$",
"SI": "^(\\d{4})$",
"SJ": "^(\\d{4})$",
"SK": "^(\\d{3} \\d{2})$",
"SL": "",
"SM": "^(4789\\d)$",
"SN": "^(\\d{5})$",
"SO": "",
"SR": "",
"SS": "^(\\d{5})$",
"ST": "",
"SV": "^(01101)$",
"SX": "^(0000 AA)$",
"SY": "",
"SZ": "^([A-Z]\\d{3})$",
"TC": "^(TKCA 1ZZ)$",
"TD": "^(\\d{5})$",
"TF": "^((984)\\d{2})$",
"TG": "",
"TH": "^(\\d{5})$",
"TJ": "^(\\d{3})$",
"TK": "",
"TL": "",
"TM": "^(\\d{6})$",
"TN": "^(\\d{4})$",
"TO": "",
"TR": "^(\\d{5})$",
"TT": "",
"TV": "",
"TW": "^(\\d{3} \\d{2})|(\\d{3})$",
"TZ": "",
"UA": "^(\\d{5})$",
"UG": "",
"US": "^\\d{5}([\\-]\\d{4})?$",
"UY": "^(\\d{5})$",
"UZ": "^(\\d{6})$",
"VA": "",
"VC": "(VC)(\\d{4})",
"VE": "^(\\d{4})$",
"VG": "^(VG11)[0-6][0]$",
"VI": "^(\\d{5})$",
"VN": "^(\\d{6})$",
"VU": "",
"WF": "",
"WS": "",
"XK": "",
"YE": "",
"YT": "^(\\d{5})$",
"ZA": "^(\\d{4})$",
"ZM": "^(\\d{5})$",
"ZW": "",
}
func (z ZipCode) GetRegex(countryCode string) (zipCodeRegex string) {
if zipCodeRegex, ok := zipCodeRegexes[countryCode]; ok {
return zipCodeRegex
}
return ""
}
func (z ZipCode) IsValid(countryCode string, zipCode string) (err error) {
zipCodeRegex := z.GetRegex(countryCode)
if zipCodeRegex == "" {
return errors.New(fmt.Sprintf("undefined zipcode regex for `%s`.", countryCode))
}
if matched, _ := regexp.MatchString(zipCodeRegex, zipCode); !matched {
return errors.New(fmt.Sprintf("invalid zipcode `%s` for regex `%s`.", zipCode, zipCodeRegex))
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment