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


200

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


4
在大多数情况下,一个用于所有邮政编码的正则表达式将毫无用处,更不用说需要大量的unicode编码了。更好的方法是逐个国家检查正则表达式,以免验证“ New York,NY AF23Q”之类的内容正确。
是的-那个杰克。

101
你有问题。您为此编写了一个正则表达式。现在您有两个问题。
罗伯特S.09年


2
处理所有可能的未来价值的方法。
Jodrell 2012年

Answers:


126

空无一人。

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

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

你不能


我怀疑可以编译正则表达式,但是这样的任务更适合数据库。正则表达式看起来像是10000 | 10001 | 10002 | 10003 | .......
Kibbee


您可以先使用与您的国家/地区匹配的正则表达式(请参阅en.wikipedia.org/wiki/List_of_postal_codes),并通过外部服务(例如geonames.org/export/ws-overview.html
SimonSimCity,2011年

3
我的2分钱:在巴西,实际上是8个数字,5个是破折号,另外3个是
Jorge Campos

^\d{5}(?:[-\s]\d{4})?$
Aamir Afridi

260

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

Google还有一个网络服务,其中包含每个国家/地区的地址格式信息,包括邮政编码,在这里-http://i18napis.appspot.com/address (我发现该链接通过http://unicode.org/review/pri180/

编辑

这里是postalCodeData.xml regex 的副本:

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

3
只需对AU邮政编码正则表达式进行快速扫描即可。此正则表达式非常简单,并且会允许许多错误的阳性表达,因此并不详尽。
Taryn East 2014年

7
包含邮政编码regex的unicode CLDR的最新版本是26.0.1版。在更高版本中,由于未维护数据并且找不到其他可靠来源,因此已将其删除。
KIKO Software

1
同样,对于法国邮政编码正则表达式非常基本。使用此一个“ ^((0 [1-9])|([1-8] [0-9])|(9 [0-8])|(2A)|(2B))[0-9] {3} $” - > developpez.net/forums/d518232/webmasters-developpement-web/...
文森特D.

我现在正在使用i18napis.appspot.com/address/data/GB;这项服务有什么问题吗?
mgol 2016年

1
对@ kiko-software的评论进行了小幅更正:包含邮政编码数据的最新版本为27.0.3
Sietse

89

使用这些regx

$ZIPREG=array(
    "US"=>"^\d{5}([\-]?\d{4})?$",
    "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]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\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"=>"^\d{6}$"
);

7
我见过的更好的尝试之一是实际回答OP。投放更多广告时,速度会变慢,但采用一种清晰明确的方法。
罗布

3
正如Rob所建议的那样,它不会随着您添加的增加而变慢,因为您会从国家/地区代码中选择一种正则表达式。
Thomaschaaf 2014年

2
我看到您在2012年发布了此信息。
rybo111 2014年

@ rybo111检查池答案。
朱利奥·卡钦

5
@ ddunn801,在验证模式和验证邮政编码之间有一个(巨大的差异)。由于(至少在美国)定期添加和删除邮政编码,因此对代码进行身份验证要困难整个数量级。在理想的情况下,您需要先进行快速检查以验证模式,然后再提交给服务(例如USPS)以验证整个邮寄地址(此类服务已付款,您不希望浪费价值不佳的数据) )。las,世界远非理想。
JBH

48
  1. 每个邮政编码系统仅使用AZ和/或0-9,有时使用空格/破折号

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

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

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

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

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

这应该涵盖以上内容:

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

8
这似乎是提供完整性检查(这可能是OP想要的)的唯一答案,而不是对每种可能组合的完整验证。正是我想要的东西
卢克斯2015年

1
@GiulioCaccin H0H0H0是有效的加拿大邮政编码(孩子们用来从加拿大邮政冒充圣诞老人的信中来),但这并不意味着它是有效的客户邮政编码:)
Neil McGuigan

2
仅供参考,美属萨摩亚群岛很小,只有一个邮政编码,它是96799-那
特尔肯

5
我认为这是唯一的好答案。例如,它可以普遍用作HTML模式属性中的预验证。
Blackbam

1
我认为,对于只想进行健全性检查而又不精确验证每个国家的情况,这是一个很好的答案。只是为了获得更干净的数据而无需付出太多努力-在需要完全安全的情况下,可能需要第三方插件/服务,就像其他人指出的那样。
Yo Ludke

17

试图用一个正则表达式覆盖整个世界并不是完全可能的,当然也不可行或不建议这样做。

并不是要吹牛角,而是我写了一些相当详尽的正则表达式,您可能会觉得有帮助。

  • 加拿大邮政编码

    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}$
  • 美国邮政编码

    ^[0-9]{5}(-[0-9]{4})?$
  • 英国邮政编码

    ^([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,尽管它是有效的。
fsschmitt,2015年

我已经针对加拿大的所有845,495邮政编码进行了验证,并且此正则表达式字符串对扩展验证进行了一些修复,以支持所有这些邮政编码。这是用于加拿大邮政编码的扩展验证的新正则表达式字符串:pastebin.com/vazqFKy4
fsschmitt 2015年

14

看起来不错的参考尽管Regex中没有,。

的确,除非您确实要向用户交付某些东西,否则我认为这样做是不值得的。而且,如果您运送它,则可以使用一些地址清洁工具/服务,以使其更轻松。


此外,即使今天是正确的邮政编码,将来也可能会更改。美国邮政不断增加新的和分裂的领域。您可以跟上的唯一方法是在实际发货时进行验证。一些城镇甚至出于各种原因选择更改自己的邮政编码。
NotMe 2010年

好像有人拿了您上面发布的Wiki文章,并使用每个国家的邮政编码regex将其输出到JSON-gist.github.com/matthewbednarski/…–
克里斯·史密斯

8

我们使用以下内容:

加拿大

([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

其他

照原样接受


1
我建议在美国添加一个可选的-[0-9] {4}。有些人确实使用其ZIP + 4。
David Thornley,

4
/ [0-9] {5}(?:-[0-9] {4})?/使您可以同时验证来自美国的两种样式。
Chas。欧文斯(Owens)

2
@ Chas.Owens添加^和$确保它们在输入之前或之后不能输入其他任何内容,例如“ 12345aaa” ... / ^ [0-9] {5}(?:-[0-9] {4}) $ /
蒂姆·富兰克林

7

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


6
.* 

大跃迁忘记了换行符,空格和控制字符。

国际邮政编码是一种制止问题。


6

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

我在这里提取了与此问题相关的位:

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

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


1
我想指出的是,法国和英国的正则表达式未考虑可能的空格;在法国,邮政编码可以输入第二个和第三个数字之间的空格(即75001而不是75001)。英国邮政编码通常用空格书写(即,SW1 1AA代替SW11AA)。
salcoin15年

@salcoin感谢您的输入,我没有注意到(即使我是法国人)。看起来Chi的答案在这方面更好。
2015年

因为str_replace没有空间的空间是超级负担?:p
罗伯特·庞德

6

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

使用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,实际上每个(#####)都是有效的。

ZERO_RESULTS如果未找到任何内容,Google将返回状态。或OK两者都正确的结果。

希望这会有所帮助。


唯一的问题是查询数量的限制,这可能取决于站点/大小。
Darryl Hein

@DarrylHein当然可以,但是要让它正常工作,这现在已经是一个很大的代价=)
Romko


2

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

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


1

您为什么要这样做,为什么要关心呢?正如汤姆·里特(Tom Ritter)所指出的,您根本就没有邮政编码,这与是否有效无关紧要,直到并且除非您实际上要向该地址发送邮件为止。即使您希望有朝一日能寄给他们,也并不意味着您今天需要邮政编码。


是的,但是如果他们要输入一个,那么最好确保此时正确。但是,我同意其中一个基本答案,即可以对您认为将是大多数客户的国家/地区进行验证。
cdmckay,2009年

1
除非邮编正确,否则某些信用结算所将不接受账单。我宁愿验证输入的邮政编码,也不要提交费用并拒绝它。
SamGoody 2012年

1

正如其他地方所指出的,世界各地的变化是巨大的。即使某些内容与模式匹配,也并不意味着它存在。

然后,当然,在很多地方不使用邮政编码(例如,很多地方或爱尔兰)。


实际上,可能是整个爱尔兰,因为我不认为D1,D2等被认为是正确的邮政编码,因为您不能仅使用此代码和街道号码来识别地址。
Dónal)

1

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

但是,编写一个涵盖全球所有邮政编码的正则表达式很疯狂。


1
这是一个好主意,直​​到代码开始拒绝有效的邮政编码(因为它有故障或邮政编码已更改)。验证是必须正确或根本不正确的事情。至少应该有一个覆盖选项。
Chas。欧文斯(Owens)

1

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

[0-9a-zA-Z]+

最好采用相当广泛的模式(远不如上述那样广泛),或者以每个国家/地区自己的特定模式来对待!

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

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


1

有人问格式化邮件地址的列表,我想这就是他想要的...

弗兰克邮政地址强迫性指南:http//www.columbia.edu/~fdc/postal/ 但是,对于街道问题并没有多大帮助。

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


1

这是用于验证美国邮政编码的非常简单的RegEx(不是ZipCode Plus Four):

(?!([089])\1{4})\d{5}

似乎所有五个位数字是除有效的邮编000008888899999

我已经测试过此RegEx http://regexpal.com/

SP


此RegEx不会对zip + 4部分强制使用四位数。例如,它认为“ 92122-1”是有效的邮政编码。
Sensei James

0

如果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}))$
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.