postcode_regexes.go raw
1 package validator
2
3 import (
4 "regexp"
5 "sync"
6 )
7
8 var postCodePatternDict = map[string]string{
9 "GB": `^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)(\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?\d{1,4}$`,
10 "JE": `^JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}$`,
11 "GG": `^GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}$`,
12 "IM": `^IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]{2}$`,
13 "US": `^\d{5}([ \-]\d{4})?$`,
14 "CA": `^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d$`,
15 "DE": `^\d{5}$`,
16 "JP": `^\d{3}-\d{4}$`,
17 "FR": `^\d{2}[ ]?\d{3}$`,
18 "AU": `^\d{4}$`,
19 "IT": `^\d{5}$`,
20 "CH": `^\d{4}$`,
21 "AT": `^\d{4}$`,
22 "ES": `^\d{5}$`,
23 "NL": `^\d{4}[ ]?[A-Z]{2}$`,
24 "BE": `^\d{4}$`,
25 "DK": `^\d{4}$`,
26 "SE": `^\d{3}[ ]?\d{2}$`,
27 "NO": `^\d{4}$`,
28 "BR": `^\d{5}[\-]?\d{3}$`,
29 "PT": `^\d{4}([\-]\d{3})?$`,
30 "FI": `^\d{5}$`,
31 "AX": `^22\d{3}$`,
32 "KR": `^\d{3}[\-]\d{3}$`,
33 "CN": `^\d{6}$`,
34 "TW": `^\d{3}(\d{2})?$`,
35 "SG": `^\d{6}$`,
36 "DZ": `^\d{5}$`,
37 "AD": `^AD\d{3}$`,
38 "AR": `^([A-HJ-NP-Z])?\d{4}([A-Z]{3})?$`,
39 "AM": `^(37)?\d{4}$`,
40 "AZ": `^\d{4}$`,
41 "BH": `^((1[0-2]|[2-9])\d{2})?$`,
42 "BD": `^\d{4}$`,
43 "BB": `^(BB\d{5})?$`,
44 "BY": `^\d{6}$`,
45 "BM": `^[A-Z]{2}[ ]?[A-Z0-9]{2}$`,
46 "BA": `^\d{5}$`,
47 "IO": `^BBND 1ZZ$`,
48 "BN": `^[A-Z]{2}[ ]?\d{4}$`,
49 "BG": `^\d{4}$`,
50 "KH": `^\d{5}$`,
51 "CV": `^\d{4}$`,
52 "CL": `^\d{7}$`,
53 "CR": `^\d{4,5}|\d{3}-\d{4}$`,
54 "HR": `^\d{5}$`,
55 "CY": `^\d{4}$`,
56 "CZ": `^\d{3}[ ]?\d{2}$`,
57 "DO": `^\d{5}$`,
58 "EC": `^([A-Z]\d{4}[A-Z]|(?:[A-Z]{2})?\d{6})?$`,
59 "EG": `^\d{5}$`,
60 "EE": `^\d{5}$`,
61 "FO": `^\d{3}$`,
62 "GE": `^\d{4}$`,
63 "GR": `^\d{3}[ ]?\d{2}$`,
64 "GL": `^39\d{2}$`,
65 "GT": `^\d{5}$`,
66 "HT": `^\d{4}$`,
67 "HN": `^(?:\d{5})?$`,
68 "HU": `^\d{4}$`,
69 "IS": `^\d{3}$`,
70 "IN": `^\d{6}$`,
71 "ID": `^\d{5}$`,
72 "IL": `^\d{5}$`,
73 "JO": `^\d{5}$`,
74 "KZ": `^\d{6}$`,
75 "KE": `^\d{5}$`,
76 "KW": `^\d{5}$`,
77 "LA": `^\d{5}$`,
78 "LV": `^\d{4}$`,
79 "LB": `^(\d{4}([ ]?\d{4})?)?$`,
80 "LI": `^(948[5-9])|(949[0-7])$`,
81 "LT": `^\d{5}$`,
82 "LU": `^\d{4}$`,
83 "MK": `^\d{4}$`,
84 "MY": `^\d{5}$`,
85 "MV": `^\d{5}$`,
86 "MT": `^[A-Z]{3}[ ]?\d{2,4}$`,
87 "MU": `^(\d{3}[A-Z]{2}\d{3})?$`,
88 "MX": `^\d{5}$`,
89 "MD": `^\d{4}$`,
90 "MC": `^980\d{2}$`,
91 "MA": `^\d{5}$`,
92 "NP": `^\d{5}$`,
93 "NZ": `^\d{4}$`,
94 "NI": `^((\d{4}-)?\d{3}-\d{3}(-\d{1})?)?$`,
95 "NG": `^(\d{6})?$`,
96 "OM": `^(PC )?\d{3}$`,
97 "PK": `^\d{5}$`,
98 "PY": `^\d{4}$`,
99 "PH": `^\d{4}$`,
100 "PL": `^\d{2}-\d{3}$`,
101 "PR": `^00[679]\d{2}([ \-]\d{4})?$`,
102 "RO": `^\d{6}$`,
103 "RU": `^\d{6}$`,
104 "SM": `^4789\d$`,
105 "SA": `^\d{5}$`,
106 "SN": `^\d{5}$`,
107 "SK": `^\d{3}[ ]?\d{2}$`,
108 "SI": `^\d{4}$`,
109 "ZA": `^\d{4}$`,
110 "LK": `^\d{5}$`,
111 "TJ": `^\d{6}$`,
112 "TH": `^\d{5}$`,
113 "TN": `^\d{4}$`,
114 "TR": `^\d{5}$`,
115 "TM": `^\d{6}$`,
116 "UA": `^\d{5}$`,
117 "UY": `^\d{5}$`,
118 "UZ": `^\d{6}$`,
119 "VA": `^00120$`,
120 "VE": `^\d{4}$`,
121 "ZM": `^\d{5}$`,
122 "AS": `^96799$`,
123 "CC": `^6799$`,
124 "CK": `^\d{4}$`,
125 "RS": `^\d{6}$`,
126 "ME": `^8\d{4}$`,
127 "CS": `^\d{5}$`,
128 "YU": `^\d{5}$`,
129 "CX": `^6798$`,
130 "ET": `^\d{4}$`,
131 "FK": `^FIQQ 1ZZ$`,
132 "NF": `^2899$`,
133 "FM": `^(9694[1-4])([ \-]\d{4})?$`,
134 "GF": `^9[78]3\d{2}$`,
135 "GN": `^\d{3}$`,
136 "GP": `^9[78][01]\d{2}$`,
137 "GS": `^SIQQ 1ZZ$`,
138 "GU": `^969[123]\d([ \-]\d{4})?$`,
139 "GW": `^\d{4}$`,
140 "HM": `^\d{4}$`,
141 "IQ": `^\d{5}$`,
142 "KG": `^\d{6}$`,
143 "LR": `^\d{4}$`,
144 "LS": `^\d{3}$`,
145 "MG": `^\d{3}$`,
146 "MH": `^969[67]\d([ \-]\d{4})?$`,
147 "MN": `^\d{6}$`,
148 "MP": `^9695[012]([ \-]\d{4})?$`,
149 "MQ": `^9[78]2\d{2}$`,
150 "NC": `^988\d{2}$`,
151 "NE": `^\d{4}$`,
152 "VI": `^008(([0-4]\d)|(5[01]))([ \-]\d{4})?$`,
153 "VN": `^[0-9]{1,6}$`,
154 "PF": `^987\d{2}$`,
155 "PG": `^\d{3}$`,
156 "PM": `^9[78]5\d{2}$`,
157 "PN": `^PCRN 1ZZ$`,
158 "PW": `^96940$`,
159 "RE": `^9[78]4\d{2}$`,
160 "SH": `^(ASCN|STHL) 1ZZ$`,
161 "SJ": `^\d{4}$`,
162 "SO": `^\d{5}$`,
163 "SZ": `^[HLMS]\d{3}$`,
164 "TC": `^TKCA 1ZZ$`,
165 "WF": `^986\d{2}$`,
166 "XK": `^\d{5}$`,
167 "YT": `^976\d{2}$`,
168 }
169
170 var (
171 postcodeRegexInit sync.Once
172 postCodeRegexDict = map[string]*regexp.Regexp{}
173 )
174
175 func initPostcodes() {
176 for countryCode, pattern := range postCodePatternDict {
177 postCodeRegexDict[countryCode] = regexp.MustCompile(pattern)
178 }
179 }
180