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