什么是最终的邮政编码和 zip 正则表达式?

Posted

技术标签:

【中文标题】什么是最终的邮政编码和 zip 正则表达式?【英文标题】:What is the ultimate postal code and zip regex? 【发布时间】:2009-02-23 16:58:17 【问题描述】:

我正在寻找最终的邮政编码和邮政编码正则表达式。我正在寻找可以覆盖世界大部分(希望是所有)的东西。

【问题讨论】:

一个单一的正则表达式用于所有邮政编码在大多数情况下都是无用的,更不用说需要大量的 unicode 编码了。更好的是逐个国家检查正则表达式,这样您就不会验证“New York, NY AF23Q”之类的内容是否正确。 你有问题。你为它写一个正则表达式。现在你有两个问题。 regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100 用于验证字段到这里 处理所有可能的未来值的那个。 @RobertS。但是写RegEx会解决你的第一个问题,所以现在你还有一个问题。 【参考方案1】:

unicode CLDR 包含每个国家/地区的邮政编码正则表达式。 (总共 158 个正则表达式!)

从http://unicode.org/Public/cldr/26.0.1/下载core.zip 解压core.zip 从解压后的内容看common/supplemental/postalCodeData.xml(直接内容:common/supplemental/postalCodeData.xml)

Google 还有一项网络服务,其中包含每个国家/地区的地址格式信息,包括邮政编码,请点击此处 - http://i18napis.appspot.com/address (我通过http://unicode.org/review/pri180/ 找到了该链接)

编辑

这里是postalCodeData.xml 正则表达式的副本:

"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[ ]?\d1,4"
"JE", "JE\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]2"
"GG", "GY\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]2"
"IM", "IM\d[\dA-Z]?[ ]?\d[ABD-HJLN-UW-Z]2"
"US", "\d5([ \-]\d4)?"
"CA", "[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJ-NPRSTV-Z][ ]?\d[ABCEGHJ-NPRSTV-Z]\d"
"DE", "\d5"
"JP", "\d3-\d4"
"FR", "\d2[ ]?\d3"
"AU", "\d4"
"IT", "\d5"
"CH", "\d4"
"AT", "\d4"
"ES", "\d5"
"NL", "\d4[ ]?[A-Z]2"
"BE", "\d4"
"DK", "\d4"
"SE", "\d3[ ]?\d2"
"NO", "\d4"
"BR", "\d5[\-]?\d3"
"PT", "\d4([\-]\d3)?"
"FI", "\d5"
"AX", "22\d3"
"KR", "\d3[\-]\d3"
"CN", "\d6"
"TW", "\d3(\d2)?"
"SG", "\d6"
"DZ", "\d5"
"AD", "AD\d3"
"AR", "([A-HJ-NP-Z])?\d4([A-Z]3)?"
"AM", "(37)?\d4"
"AZ", "\d4"
"BH", "((1[0-2]|[2-9])\d2)?"
"BD", "\d4"
"BB", "(BB\d5)?"
"BY", "\d6"
"BM", "[A-Z]2[ ]?[A-Z0-9]2"
"BA", "\d5"
"IO", "BBND 1ZZ"
"BN", "[A-Z]2[ ]?\d4"
"BG", "\d4"
"KH", "\d5"
"CV", "\d4"
"CL", "\d7"
"CR", "\d4,5|\d3-\d4"
"HR", "\d5"
"CY", "\d4"
"CZ", "\d3[ ]?\d2"
"DO", "\d5"
"EC", "([A-Z]\d4[A-Z]|(?:[A-Z]2)?\d6)?"
"EG", "\d5"
"EE", "\d5"
"FO", "\d3"
"GE", "\d4"
"GR", "\d3[ ]?\d2"
"GL", "39\d2"
"GT", "\d5"
"HT", "\d4"
"HN", "(?:\d5)?"
"HU", "\d4"
"IS", "\d3"
"IN", "\d6"
"ID", "\d5"
"IL", "\d5"
"JO", "\d5"
"KZ", "\d6"
"KE", "\d5"
"KW", "\d5"
"LA", "\d5"
"LV", "\d4"
"LB", "(\d4([ ]?\d4)?)?"
"LI", "(948[5-9])|(949[0-7])"
"LT", "\d5"
"LU", "\d4"
"MK", "\d4"
"MY", "\d5"
"MV", "\d5"
"MT", "[A-Z]3[ ]?\d2,4"
"MU", "(\d3[A-Z]2\d3)?"
"MX", "\d5"
"MD", "\d4"
"MC", "980\d2"
"MA", "\d5"
"NP", "\d5"
"NZ", "\d4"
"NI", "((\d4-)?\d3-\d3(-\d1)?)?"
"NG", "(\d6)?"
"OM", "(PC )?\d3"
"PK", "\d5"
"PY", "\d4"
"PH", "\d4"
"PL", "\d2-\d3"
"PR", "00[679]\d2([ \-]\d4)?"
"RO", "\d6"
"RU", "\d6"
"SM", "4789\d"
"SA", "\d5"
"SN", "\d5"
"SK", "\d3[ ]?\d2"
"SI", "\d4"
"ZA", "\d4"
"LK", "\d5"
"TJ", "\d6"
"TH", "\d5"
"TN", "\d4"
"TR", "\d5"
"TM", "\d6"
"UA", "\d5"
"UY", "\d5"
"UZ", "\d6"
"VA", "00120"
"VE", "\d4"
"ZM", "\d5"
"AS", "96799"
"CC", "6799"
"CK", "\d4"
"RS", "\d6"
"ME", "8\d4"
"CS", "\d5"
"YU", "\d5"
"CX", "6798"
"ET", "\d4"
"FK", "FIQQ 1ZZ"
"NF", "2899"
"FM", "(9694[1-4])([ \-]\d4)?"
"GF", "9[78]3\d2"
"GN", "\d3"
"GP", "9[78][01]\d2"
"GS", "SIQQ 1ZZ"
"GU", "969[123]\d([ \-]\d4)?"
"GW", "\d4"
"HM", "\d4"
"IQ", "\d5"
"KG", "\d6"
"LR", "\d4"
"LS", "\d3"
"MG", "\d3"
"MH", "969[67]\d([ \-]\d4)?"
"MN", "\d6"
"MP", "9695[012]([ \-]\d4)?"
"MQ", "9[78]2\d2"
"NC", "988\d2"
"NE", "\d4"
"VI", "008(([0-4]\d)|(5[01]))([ \-]\d4)?"
"PF", "987\d2"
"PG", "\d3"
"PM", "9[78]5\d2"
"PN", "PCRN 1ZZ"
"PW", "96940"
"RE", "9[78]4\d2"
"SH", "(ASCN|STHL) 1ZZ"
"SJ", "\d4"
"SO", "\d5"
"SZ", "[HLMS]\d3"
"TC", "TKCA 1ZZ"
"WF", "986\d2"
"XK", "\d5"
"YT", "976\d2"

【讨论】:

只要快速扫描一下 AU 邮政编码正则表达式...这个正则表达式非常简单,会允许大量误报,因此并不详尽。 包含邮政编码正则表达式的 unicode CLDR 的最新版本是 26.0.1 版。在后来的版本中,它已被删除,因为没有维护数据并且找不到其他可靠的来源。 相同,非常基本的法语邮政编码正则表达式。使用这个"^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9] 3$" -> developpez.net/forums/d518232/webmasters-developpement-web/… 我现在使用i18napis.appspot.com/address/data/GB;这项服务有什么问题吗? 对@kiko-software 评论的小修正:包含邮政编码数据的最新版本是27.0.3。【参考方案2】:

没有。

世界各地的邮政编码不遵循共同的模式。在某些国家/地区,它们由数字组成,在其他国家/地区,它们可以是数字和字母的组合,有些可以包含空格,有些可以包含点,字符的数量可以从两个到至少六个不等...

您可以做的(理论上)是为世界上每个国家/地区创建一个单独的正则表达式,不推荐 IMO。但是您仍然会在验证部分丢失:邮政编码12345 可能存在,但12346 不存在,也许12344 也不存在。你如何用正则表达式检查?

你不能。

【讨论】:

我怀疑可以编译正则表达式,但这样的任务更适合数据库。正则表达式看起来像 10000|10001|10002|10003|....... 为了验证一个字段去这里regexlib.com/Search.aspx?k=decimal&c=3&m=-1&ps=100 您可以先使用与您所在国家/地区匹配的正则表达式(请参阅en.wikipedia.org/wiki/List_of_postal_codes),然后通过geonames.org/export/ws-overview.html等外部服务进行实际检查 我的两分钱:在巴西实际上是 8 个数字,5 个后面跟着一个破折号,还有 3 个 ^\d5(?:[-\s]\d4)?$【参考方案3】:

使用这些正则表达式

$ZIPREG=array(
    "US"=>"^\d5([\-]?\d4)?$",
    "UK"=>"^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]2\d[A-Z\d]??)[ ]??(\d[A-Z]2)$",
    "DE"=>"\b((?:0[1-46-9]\d3)|(?:[1-357-9]\d4)|(?:[4][0-24-9]\d3)|(?:[6][013-9]\d3))\b",
    "CA"=>"^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ 0,1(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$",
    "FR"=>"^(F-)?((2[A|B])|[0-9]2)[0-9]3$",
    "IT"=>"^(V-|I-)?[0-9]5$",
    "AU"=>"^(0[289][0-9]2)|([1345689][0-9]3)|(2[0-8][0-9]2)|(290[0-9])|(291[0-4])|(7[0-4][0-9]2)|(7[8-9][0-9]2)$",
    "NL"=>"^[1-9][0-9]3\s?([a-zA-Z]2)?$",
    "ES"=>"^([1-9]2|[0-9][1-9]|[1-9][0-9])[0-9]3$",
    "DK"=>"^([D|d][K|k]( |-))?[1-9]1[0-9]3$",
    "SE"=>"^(s-|S-)0,1[0-9]3\s?[0-9]2$",
    "BE"=>"^[1-9]1[0-9]3$",
    "IN"=>"^\d6$"
);

【讨论】:

我见过的更好的尝试之一是实际回答 OP。广告越多,速度越慢,但方法清晰明了。 按照 Rob 的建议添加更多内容并不会变慢,因为您会从国家代码中选择一个正则表达式。 我看到你在 2012 年发布了这个。从那以后还有吗? @rybo111 查智答。 @ddunn801,验证模式和验证邮政编码之间存在(巨大的)差异。由于(至少在美国)邮政编码是定期添加和删除的,因此验证代码的难度要大几个数量级。在理想情况下,您将在提交给服务(例如 USPS)之前执行快速检查以验证模式以验证整个邮寄地址(这样的服务是付费的,您不想用坏数据浪费价值)。唉,这个世界远非理想。【参考方案4】:

    每个邮政编码系统仅使用 A-Z 和/或 0-9,有时还使用空格/破折号

    并非每个国家/地区都使用邮政编码(例如都柏林以外的爱尔兰),但我们将在这里忽略它。

    最短的邮政编码格式是塞拉利昂NN

    最长的是美属萨摩亚NNNNN-NNNNNN

    您应该允许一个空格或破折号。

    不应以空格或破折号开头或结尾

这应该涵盖以上内容:

(?i)^[a-z0-9][a-z0-9\- ]0,10[a-z0-9]$

【讨论】:

这似乎是唯一提供健全性检查的答案(这可能是 OP 想要的),而不是对每个可能的组合进行全面验证。正是我想要的 thx 仅供参考,美属萨摩亚很小,只有一个邮政编码,它是 96799 在我看来这是唯一好的答案。例如,它可以普遍用作 HTML 模式属性中的预验证。 我认为对于只想进行健全性检查而不是按国家/地区进行精确验证的情况,这是一个很好的答案。只是为了不费吹灰之力地获得一些更清洁的数据——在需要完全安全的情况下,可能需要第三方插件/服务,正如其他人指出的那样。 对于 javascript,删除 "(?i) 因为它不符合 ECMA 脚本。您可以使用它。^[a-z0-9][a-z0-9\- ]0,10[a-z0-9]$【参考方案5】:

试图用一个正则表达式覆盖整个世界是不可能的,当然也不可行或不推荐。

不要自吹自擂,但我已经写了一些非常详尽的正则表达式,你可能会觉得有帮助。

Canadian postal codes

Basic validation:
^[ABCEGHJ-NPRSTVXY]1[0-9]1[ABCEGHJ-NPRSTV-Z]1[ ]?[0-9]1[ABCEGHJ-NPRSTV-Z]1[0-9]1$

Extended validation:
^(A(0[ABCEGHJ-NPR]|1[ABCEGHK-NSV-Y]|2[ABHNV]|5[A]|8[A])|B(0[CEHJ-NPRSTVW]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGHJNRSTV-Z]|3[ABEGHJ-NPRSTVZ]|4[ABCEGHNPRV]|5[A]|6[L]|9[A])|C(0[AB]|1[ABCEN])|E(1[ABCEGHJNVWX]|2[AEGHJ-NPRSV]|3[ABCELNVYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTV]|6[ABCEGHJKL]|7[ABCEGHJ-NP]|8[ABCEGJ-NPRST]|9[ABCEGH])|G(0[ACEGHJ-NPRSTV-Z]|1[ABCEGHJ-NPRSTV-Y]|2[ABCEGJ-N]|3[ABCEGHJ-NZ]|4[ARSTVWXZ]|5[ABCHJLMNRTVXYZ]|6[ABCEGHJKLPRSTVWXZ]|7[ABGHJKNPSTXYZ]|8[ABCEGHJ-NPTVWYZ]|9[ABCHNPRTX])|H(0[HM]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRSTV-Z]|4[ABCEGHJ-NPRSTV-Z]|5[AB]|7[ABCEGHJ-NPRSTV-Y]|8[NPRSTYZ]|9[ABCEGHJKPRSWX])|J(0[ABCEGHJ-NPRSTV-Z]|1[ACEGHJ-NRSTXZ]|2[ABCEGHJ-NRSTWXY]|3[ABEGHLMNPRTVXYZ]|4[BGHJ-NPRSTV-Z]|5[ABCJ-MRTV-Z]|6[AEJKNRSTVWYXZ]|7[ABCEGHJ-NPRTV-Z]|8[ABCEGHLMNPRTVXYZ]|9[ABEHJLNTVXYZ])|K(0[ABCEGHJ-M]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-MPRSTVW]|4[ABCKMPR]|6[AHJKTV]|7[ACGHK-NPRSV]|8[ABHNPRV]|9[AHJKLV])|L(0[[ABCEGHJ-NPRS]]|1[ABCEGHJ-NPRSTV-Z]|2[AEGHJMNPRSTVW]|3[BCKMPRSTVXYZ]|4[ABCEGHJ-NPRSTV-Z]|5[ABCEGHJ-NPRSTVW]|6[ABCEGHJ-MPRSTV-Z]|7[ABCEGJ-NPRST]|8[EGHJ-NPRSTVW]|9[ABCGHK-NPRSTVWYZ])|M(1[BCEGHJ-NPRSTVWX]|2[HJ-NPR]|3[ABCHJ-N]|4[ABCEGHJ-NPRSTV-Y]|5[ABCEGHJ-NPRSTVWX]|6[ABCEGHJ-NPRS]|7[AY]|8[V-Z]|9[ABCLMNPRVW])|N(0[ABCEGHJ-NPR]|1[ACEGHKLMPRST]|2[ABCEGHJ-NPRTVZ]|3[ABCEHLPRSTVWY]|4[BGKLNSTVWXZ]|5[ACHLPRV-Z]|6[ABCEGHJ-NP]|7[AGLMSTVWX]|8[AHMNPRSTV-Y]|9[ABCEGHJKVY])|P(0[ABCEGHJ-NPRSTV-Y]|1[ABCHLP]|2[ABN]|3[ABCEGLNPY]|4[NPR]|5[AEN]|6[ABC]|7[ABCEGJKL]|8[NT]|9[AN])|R(0[ABCEGHJ-M]|1[ABN]|2[CEGHJ-NPRV-Y]|3[ABCEGHJ-NPRSTV-Y]|4[AHJKL]|5[AGH]|6[MW]|7[ABCN]|8[AN]|9[A])|S(0[ACEGHJ-NP]|2[V]|3[N]|4[AHLNPRSTV-Z]|6[HJKVWX]|7[HJ-NPRSTVW]|9[AHVX])|T(0[ABCEGHJ-MPV]|1[ABCGHJ-MPRSV-Y]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NPRZ]|4[ABCEGHJLNPRSTVX]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTVWX]|7[AENPSVXYZ]|8[ABCEGHLNRSVWX]|9[ACEGHJKMNSVWX])|V(0[ABCEGHJ-NPRSTVWX]|1[ABCEGHJ-NPRSTV-Z]|2[ABCEGHJ-NPRSTV-Z]|3[ABCEGHJ-NRSTV-Y]|4[ABCEGK-NPRSTVWXZ]|5[ABCEGHJ-NPRSTV-Z]|6[ABCEGHJ-NPRSTV-Z]|7[ABCEGHJ-NPRSTV-Y]|8[ABCGJ-NPRSTV-Z]|9[ABCEGHJ-NPRSTV-Z])|X(0[ABCGX]|1[A])|Y(0[AB]|1[A]))[ ]?[0-9]1[ABCEGHJ-NPRSTV-Z]1[0-9]1$

US ZIP codes

^[0-9]5(-[0-9]4)?$

UK post codes

^([A-PR-UWYZ]([0-9]1,2|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\ [0-9][ABD-HJLNP-UW-Z]2|(GIR\ 0AA)|(SAN\ TA1)|(BFPO\ (C\/O\ )?[0-9]1,4)|((ASCN|BBND|[BFS]IQQ|PCRN|STHL|TDCU|TKCA)\ 1ZZ))$

如果不将某些东西实际邮寄到某个地址并让对方在收到邮件时通知您,就不可能保证准确性,但我们可以通过消除我们知道的不良案例来缩小范围。

【讨论】:

加拿大邮政编码的扩展版本可能有错误或缺失,因为它表示以下邮政编码无效:E3G 0A1,尽管它是有效的。 我已针对加拿大的所有 845,495 个邮政编码进行了验证,并且此正则表达式字符串对扩展验证进行了一些修复,以支持所有这些邮政编码。这是加拿大邮政编码扩展验证的新正则表达式字符串:pastebin.com/vazqFKy4【参考方案6】:

我们使用以下内容:

加拿大

([A-Z]1[0-9]1)3   //We raise to upper first

美国

[0-9]5                //-or-
[0-9]5-[0-9]4       //10 digit zip

其他

按原样接受

【讨论】:

我建议在美国添加一个可选的 -[0-9]4。有些人确实使用他们的 ZIP+4。 /[0-9]5(?:-[0-9]4)?/ 可让您同时验证来自美国的两种样式。 @Chas.Owens 添加 ^ 和 $ 确保他们不能在之前或之后输入任何其他内容,例如 "12345aaa" ... /^[0-9]5(?:-[ 0-9]4)?$/【参考方案7】:

根据您的应用程序,您可能希望为大多数访问者来源的国家/地区实施正则表达式匹配,而对其余国家/地区不进行验证(接受任何内容)。

【讨论】:

【参考方案8】:

请注意,正如接受的答案所述,这是一个相当困难的问题。 我想这并没有阻止geonames.org 的人们。 他们有一个文件country info file,它不完全适合这个答案 - 限制显然是 30000 个字符。有大约 150 个国家/地区的正则表达式。

我在这里提取了与这个问题相关的部分:

AD ^(?:AD)*(\d3)$
AM ^(\d6)$
AR ^([A-Z]\d4[A-Z]3)$
AT ^(\d4)$
AU ^(\d4)$
AX ^(?:FI)*(\d5)$
AZ ^(?:AZ)*(\d4)$
BA ^(\d5)$
BB ^(?:BB)*(\d5)$
BD ^(\d4)$
BE ^(\d4)$
BG ^(\d4)$
BH ^(\d3\d?)$
BM ^([A-Z]2\d2)$
BN ^([A-Z]2\d4)$
BR ^(\d8)$
BY ^(\d6)$
CA ^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) ?(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$
CH ^(\d4)$
CL ^(\d7)$
CN ^(\d6)$
CR ^(\d4)$
CU ^(?:CP)*(\d5)$
CV ^(\d4)$
CX ^(\d4)$
CY ^(\d4)$
CZ ^(\d5)$
DE ^(\d5)$
DK ^(\d4)$
DO ^(\d5)$
DZ ^(\d5)$
EC ^([a-zA-Z]\d4[a-zA-Z])$
EE ^(\d5)$
EG ^(\d5)$
ES ^(\d5)$
ET ^(\d4)$
FI ^(?:FI)*(\d5)$
FM ^(\d5)$
FO ^(?:FO)*(\d3)$
FR ^(\d5)$
GB ^(([A-Z]\d2[A-Z]2)|([A-Z]\d3[A-Z]2)|([A-Z]2\d2[A-Z]2)|([A-Z]2\d3[A-Z]2)|([A-Z]\d[A-Z]\d[A-Z]2)|([A-Z]2\d[A-Z]\d[A-Z]2)|(GIR0AA))$
GE ^(\d4)$
GF ^((97|98)3\d2)$
GG ^(([A-Z]\d2[A-Z]2)|([A-Z]\d3[A-Z]2)|([A-Z]2\d2[A-Z]2)|([A-Z]2\d3[A-Z]2)|([A-Z]\d[A-Z]\d[A-Z]2)|([A-Z]2\d[A-Z]\d[A-Z]2)|(GIR0AA))$
GL ^(\d4)$
GP ^((97|98)\d3)$
GR ^(\d5)$
GT ^(\d5)$
GU ^(969\d2)$
GW ^(\d4)$
HN ^([A-Z]2\d4)$
HR ^(?:HR)*(\d5)$
HT ^(?:HT)*(\d4)$
HU ^(\d4)$
ID ^(\d5)$
IL ^(\d5)$
IM ^(([A-Z]\d2[A-Z]2)|([A-Z]\d3[A-Z]2)|([A-Z]2\d2[A-Z]2)|([A-Z]2\d3[A-Z]2)|([A-Z]\d[A-Z]\d[A-Z]2)|([A-Z]2\d[A-Z]\d[A-Z]2)|(GIR0AA))$
IN ^(\d6)$
IQ ^(\d5)$
IR ^(\d10)$
IS ^(\d3)$
IT ^(\d5)$
JE ^(([A-Z]\d2[A-Z]2)|([A-Z]\d3[A-Z]2)|([A-Z]2\d2[A-Z]2)|([A-Z]2\d3[A-Z]2)|([A-Z]\d[A-Z]\d[A-Z]2)|([A-Z]2\d[A-Z]\d[A-Z]2)|(GIR0AA))$
JO ^(\d5)$
JP ^(\d7)$
KE ^(\d5)$
KG ^(\d6)$
KH ^(\d5)$
KP ^(\d6)$
KR ^(?:SEOUL)*(\d6)$
KW ^(\d5)$
KZ ^(\d6)$
LA ^(\d5)$
LB ^(\d4(\d4)?)$
LI ^(\d4)$
LK ^(\d5)$
LR ^(\d4)$
LS ^(\d3)$
LT ^(?:LT)*(\d5)$
LU ^(\d4)$
LV ^(?:LV)*(\d4)$
MA ^(\d5)$
MC ^(\d5)$
MD ^(?:MD)*(\d4)$
ME ^(\d5)$
MG ^(\d3)$
MK ^(\d4)$
MM ^(\d5)$
MN ^(\d6)$
MQ ^(\d5)$
MT ^([A-Z]3\d2\d?)$
MV ^(\d5)$
MX ^(\d5)$
MY ^(\d5)$
MZ ^(\d4)$
NC ^(\d5)$
NE ^(\d4)$
NF ^(\d4)$
NG ^(\d6)$
NI ^(\d7)$
NL ^(\d4[A-Z]2)$
NO ^(\d4)$
NP ^(\d5)$
NZ ^(\d4)$
OM ^(\d3)$
PF ^((97|98)7\d2)$
PG ^(\d3)$
PH ^(\d4)$
PK ^(\d5)$
PL ^(\d5)$
PM ^(97500)$
PR ^(\d9)$
PT ^(\d7)$
PW ^(96940)$
PY ^(\d4)$
RE ^((97|98)(4|7|8)\d2)$
RO ^(\d6)$
RS ^(\d6)$
RU ^(\d6)$
SA ^(\d5)$
SD ^(\d5)$
SE ^(?:SE)*(\d5)$
SG ^(\d6)$
SH ^(STHL1ZZ)$
SI ^(?:SI)*(\d4)$
SK ^(\d5)$
SM ^(4789\d)$
SN ^(\d5)$
SO ^([A-Z]2\d5)$
SV ^(?:CP)*(\d4)$
SZ ^([A-Z]\d3)$
TC ^(TKCA 1ZZ)$
TH ^(\d5)$
TJ ^(\d6)$
TM ^(\d6)$
TN ^(\d4)$
TR ^(\d5)$
TW ^(\d5)$
UA ^(\d5)$
US ^\d5(-\d4)?$
UY ^(\d5)$
UZ ^(\d6)$
VA ^(\d5)$
VE ^(\d4)$
VI ^\d5(-\d4)?$
VN ^(\d6)$
WF ^(986\d2)$
YT ^(\d5)$
ZA ^(\d4)$
ZM ^(\d5)$
CS ^(\d5)$

希望我没有犯任何错误,我的正则表达式很弱。

【讨论】:

我想指出法国和英国的正则表达式没有考虑可能的空格;在法国,邮政编码可以在第二位和第三位之间输入一个空格(即 75 001 而不是 75001)。英国邮政编码经常用空格书写(即 SW1 1AA 而不是 SW11AA)。 @salcoin 感谢您的输入,我没有注意到(即使我是法国人)。在这方面,Chi 的回答似乎更好。 因为 str_replace 一个没有空格的空格是超级费力的吧? :p【参考方案9】:
.* 

Big Jump 忘记了换行符、空格和控制字符。

国际邮政编码是一种停机问题。

【讨论】:

【参考方案10】:

如果有人仍然对如何验证邮政编码感兴趣,我已经找到了解决方案:

使用Google Geocoding API,我们可以检查具有国家/地区代码邮政编码本身的邮政编码的有效性。

例如,我住在乌克兰,所以我可以这样检查: https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:80380|country:UA

或者使用JS API:https://developers.google.com/maps/documentation/javascript/geocoding#ComponentFiltering

80380 是乌克兰的有效 ZIP,实际上每个 (#####) 都是有效的。

如果没有找到,Google 会返回 ZERO_RESULTS 状态。 或OK,如果两者都正确,则返回结果。

希望这会有所帮助。

【讨论】:

唯一的问题是查询数量的限制,这可能是一个问题,具体取决于站点/大小。 @DarrylHein 当然,但现在让它工作的代价相当大=)【参考方案11】:

正如其他人所指出的,一个正则表达式来统治它们是不可能的。但是,您可以使用 address formatting info from the Universal Postal Union(一个鲜为人知的联合国机构)为尽可能多的国家/地区制作正则表达式。

例如,以下是一些国家/地区的地址格式规则,包括邮政编码(PDF 格式):

Canada Japan Switzerland Russian Federation United States of America

【讨论】:

【参考方案12】:

问题在于,您可能没有很好的方法来跟上地球另一端国家不断变化的邮政编码要求,而且您没有共同的语言。除非您有足够大的预算来跟踪这一点,否则您几乎肯定最好将验证地址的责任交给 google 或 yahoo。

两家公司都通过可编程 API 提供地址查找功能。

【讨论】:

【参考方案13】:

鉴于每个国家/地区都有如此多的边缘情况(例如,伦敦地址可能使用与英国其他地区略有不同的格式),我认为除了可能之外没有终极正则表达式:

[0-9a-zA-Z]+

最好采用相当广泛的模式(也没有上述那么广泛),或者用自己的特定模式对待每个国家/地区!

更新:但是,可以根据许多较小的区域特定规则动态构建正则表达式 - 但不确定性能!

可以在RegExLib 网站上找到许多特定于国家/地区的模式。

【讨论】:

【参考方案14】:

你为什么要这样做,你为什么在乎?正如汤姆·里特(Tom Ritter)指出的那样,您是否有邮政编码都无关紧要,更不用说它是否有效,除非您实际上要向该地址发送某些东西。即使您希望自己某天会寄给他们一些东西,但这并不意味着您需要一个邮政编码今天

【讨论】:

是的,但如果他们要进入一个,不妨在那时确保它是正确的。但是,我同意其他答案之一,基本上说,让它验证您认为将成为您的大多数客户的国家/地区。 一些信用票据交换所不会接受账单,除非邮编是正确的。我宁愿在输入时验证 zip,而不是提交费用并拒绝它。【参考方案15】:

正如其他地方所指出的,世界各地的差异很大。即使与模式匹配的东西并不意味着它存在。

当然,还有很多地方没有使用邮政编码(例如,很多地方或爱尔兰)。

【讨论】:

实际上,可能整个爱尔兰,因为我不认为 D1、D2 等被认为是正确的邮政编码,因为您无法仅使用此代码和门牌号来识别地址。 【参考方案16】:

拥有准确的邮政编码还有其他原因。进行跨境旅行(当然欧元区除外)的旅行社需要提前将这些信息提供给当局。通常这些信息是由可能熟悉或不熟悉此类事物的代理输入的。任何可以减少错误的方法都是好主意™

但是,编写一个涵盖世界上所有邮政编码的正则表达式将是疯狂的。

【讨论】:

这只是一个好主意,直​​到代码开始拒绝有效的邮政编码,因为它有错误或邮政编码已更改。验证是必须正确或根本不存在的东西。至少应该有一个覆盖选项。【参考方案17】:

有人在询问格式化邮寄地址的列表,我想这就是他要找的……

Frank 的邮政地址强制指南:http://www.columbia.edu/~fdc/postal/ 然而,对街道层面的问题没有多大帮助。

我的工作使用了几个工具来帮助解决这个问题: - Lexis-Nexis 服务,包括 NCOA 查询(您将“免费”获得地址标准化) - “梅丽莎数据”http://www.melissadata.com

【讨论】:

【参考方案18】:

这是一个非常简单的正则表达式,用于验证美国邮政编码(不是邮政编码加四):

(?!([089])\14)\d5

除了000008888899999 之外,似乎所有五位数字都是有效的邮政编码。

我已经用http://regexpal.com/测试了这个正则表达式

SP

【讨论】:

此 RegEx 不强制 zip+4 部分使用四位数字。例如。它认为“92122-1”是一个有效的邮政编码。【参考方案19】:

如果Zip Code 允许字符和数字(字母数字),则将使用下面的正则表达式匹配,5 或 9 或 10 个字母数字字符和一个连字符 (-):

^([0-9A-Za-z]5|[0-9A-Za-z]9|(([0-9a-zA-Z]5-)1[0-9a-zA-Z]4))$

【讨论】:

【参考方案20】:

我知道这是一个老问题,但我偶然发现了同样的问题。 我有来自 100 多个国家/地区的发票,并试图让正确的债权人通过邮编(如果所有其他检查都失败)。 所以我所做的是编写一个简短的 Python 脚本,它从字符串创建一个模式:

class RegexPatternBuilder:
    """
    Builds a regex pattern out of a given string(i.e. --> HM452 AX2155 : [A-Z]2\d3\s1[A-Z]2\d4)
    """
    __is_alpha_count = 0
    __is_numeric_count = 0
    __is_whitespace_count = 0
    __pattern = ""

    # Count: wich character of the string we're locking at right now
    __count = 0

    # Countrys like  Andora starts theire ZIP with the country abbreviation :AD500
    # So check at first if the ZIP starts with the abbreviation and if so, add it to the pattern and increase the count.
    def __init__(self, zip_string, country):
        self.__zip_string = zip_string
        self.__country = country
        if self.__zip_string.startswith(country):
            self.__pattern = f'(self.__country)'
            self.__count += len(self.__country)

    def build_regex(self):
        # Last step ;
        # Add the current alpha_numeric pattern with count
        if len(self.__zip_string) == self.__count:
            if self.__is_alpha_count:
                self.__pattern += f"[A-Z]self.__is_alpha_count"
            if self.__is_numeric_count:
                self.__pattern += f"\dself.__is_numeric_count"
            return f'self.__pattern\\b'

        # Case: Whitespace
        # Check if there is a crossing from numeric / alphanumeric to whitespace,
        # if so --> add the alpha_numeric regex to the whole pattern with the
        # count as the number of viable appeaerances.
        # Since there is max 1 whitespace in a ZIP, add the whitespace regex immediately.
        # Every other case is similar to that.
        if self.__zip_string[self.__count].isspace():
            if self.__is_numeric_count:
                self.__pattern += f"\dself.__is_numeric_count"
            if self.__is_alpha_count:
                self.__pattern += f"[A-Z]self.__is_alpha_count"
            self.__pattern += "\s1"
            self.__is_whitespace_count += 1
            self.__is_alpha_count = 0
            self.__is_numeric_count = 0

        # Case: Is Alphanumeric
        if self.__zip_string[self.__count].isalpha():
            if self.__is_numeric_count:
                self.__pattern += f"[0-9]self.__is_numeric_count"
            self.__is_whitespace_count = 0
            self.__is_alpha_count += 1
            self.__is_numeric_count = 0

        # Case: Is Numeric
        if self.__zip_string[self.__count].isnumeric():
            if self.__is_alpha_count:
                self.__pattern += f"[A-Z]self.__is_alpha_count"
            self.__is_whitespace_count = 0
            self.__is_alpha_count = 0
            self.__is_numeric_count += 1

        # Case: Special Character (i.e. - )
        # No escaping or count for this so far, because it shouldn't be needed for our zip purposes
        if not self.__zip_string[self.__count].isalpha() \
                and not self.__zip_string[self.__count].isnumeric() \
                and not self.__zip_string[self.__count].isspace():
            self.__pattern += f'self.__zip_string[self.__count]1'
        self.__count += 1
        return self.build_regex()

因此,我为我们历史上拥有的所有 zip(按国家/地区)创建了所有不同的可能正则表达式,并将它们写回 db 表中(即最后是这样的: COUNTRY:RE PATTERN:(\d5)\b [这可能是哪个国家 ;D])

也许它对某人有帮助。

【讨论】:

以上是关于什么是最终的邮政编码和 zip 正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery:验证美国邮政的正则表达式不起作用

美国和其他格式 zip 的正则表达式 [重复]

java中身份*号正则表达式

文字 编码 正则表达式 切换

如何从正则表达式捕获组中修剪空白?

带空格的英国邮政编码正则表达式