postcode_regexes.go 4.2 KB

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