英国邮政编码正则expression式(综合)

我是一个正则expression式,将validation一个完整的英国邮政编码只在一个inputstring。 所有不常见的邮政编码表格必须与通常一样覆盖。 例如:

火柴

  • CW3 9SS
  • SE5 0EG
  • SE50EG
  • se5 0eg
  • WC2H 7LT

不匹配

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

这种东西有没有官方的,甚至半官方的正规expression式? 任何其他的build议,格式化和存储在数据库中?

我build议看看英国政府数据标准的邮编[现在链接已死; XML的存档 ,请参阅维基百科讨论]。 有一个关于数据的简要描述,附加的xml模式提供了一个正则expression式。 这可能不完全是你想要的,但将是一个很好的起点。 RegEx不同于XML,作为格式为A9A 9AA的第三个P字符被给定的定义允许。

英国政府提供的RegEx是:

([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))\s?[0-9][A-Za-z]{2}) 

正如维基百科讨论中指出的那样,这将允许一些非真实的邮政编码(例如那些以AA,ZY开头的邮政编码),他们提供了一个更严格的testing,你可以尝试。

看起来我们要使用^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$ ,那是上面Minglis所要求的。

然而,我们将不得不调查究竟是什么规则,因为上面列出的各种解决scheme似乎适用不同的规则,哪些字母是允许的。

经过一番调查,我们发现了更多的信息。 显然,在“govtalk.gov.uk”上的一个页面指向邮政编码规范govtalk-postcodes 。 这指向XML模式的XML模式 ,它提供了邮政编码规则的“伪正则expression式”语句。

我们已经采取了这一点,并努力了一下,给了我们以下的expression:

 ^((GIR &0AA)|((([A-PR-UWYZ][A-HK-Y]?[0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]))) &[0-9][ABD-HJLNP-UW-Z]{2}))$ 

这使空间可选,但限制你到一个空间(用'{0'replace'&'为无限空间)。 它假定所有的文本都必须是大写的。

如果您想允许小写字母和任意数量的空格,请使用:

 ^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$ 

这不包括海外领土,只是执行格式,而不是存在不同的领域。 它基于以下规则:

可以接受以下格式:

  • “GIR 0AA”
  • A9 9ZZ
  • A99 9ZZ
  • AB9 9ZZ
  • AB99 9ZZ
  • A9C 9ZZ
  • AD9E 9ZZ

哪里:

  • 9可以是任何单个的数字号码。
  • A可以是除Q,V或X之外的任何字母。
  • B可以是除I,J或Z之外的任何字母。
  • C可以是除I,L,M,N,O,P,Q,R,V,X,Y或Z以外的任何字母。
  • D可以是除I,J或Z之外的任何字母。
  • E可以是A,B,E,H,M,N,P,R,V,W,X或Y中的任何一个。
  • Z可以是除C,I,K,M,O或V以外的任何字母。

最好的祝愿

科林

有没有这样的事情,作为一个全面的英国邮政编码正则expression式能够validation邮政编码。 您可以使用正则expression式检查邮政编码的格式是否正确; 并不是说它确实存在。

邮政编码是任意复杂和不断变化的。 例如,对于每个邮政编码区域,外码W1不会,也可能永远不会具有1到99之间的每个数字。

你不能指望永远是真的。 例如,在一九九零年,邮政署决定香港仔有点拥挤。 他们在AB1-5的末尾添加了一个0,使之成为AB10-50,然后在它们之间创build了许多邮政编码。

每当build立新的街道时,都会创build一个新的邮政编码。 这是获得构build许可的过程的一部分; 地方当局有义务与邮局保持一致(不是他们都这么做)。

此外,正如许多其他用户所指出的,还有一些特殊的邮政编码,例如Girobank,GIR 0AA,以及圣诞老人,SAN TA1的信件 – 您可能不想在邮件中发帖,但看起来并不被其他答案覆盖。

然后是BFPO邮政编码,现在正在变成更标准的格式 。 这两种格式都将是有效的。 最后,还有海外领地来源维基百科

 + ---------- + -------------------------------------- -------- +
 | 邮政编码| 位置|
 + ---------- + -------------------------------------- -------- +
 |  AI-2640 | 安圭拉|
 |  ASCN 1ZZ | 阿森松岛|
 |  STHL 1ZZ | 圣赫勒拿|
 |  TDCU 1ZZ |  Tristan da Cunha |
 |  BBND 1ZZ | 英属印度洋领地|
 |  BIQQ 1ZZ | 英属南极领土|
 |  FIQQ 1ZZ | 福克兰群岛|
 |  GX11 1AA | 直布罗陀|
 |  PCRN 1ZZ | 皮特凯恩群岛|
 |  SIQQ 1ZZ | 南乔治亚州和南桑威奇群岛|
 |  TKCA 1ZZ | 特克斯和凯科斯群岛|
 + ---------- + -------------------------------------- -------- + 

接下来,您必须考虑到英国将邮政编码系统“出口”到世界上许多地方。 validation“英国”邮政编码的任何内容都将validation其他一些国家的邮政编码。

如果要validation英国邮政编码,最安全的方法是使用当前邮政编码查询。 有很多select:

  • Ordnance Survey根据开放数据许可证发布Code-Point Open 。 这将是非常落后的时代,但它是免费的。 这将(可能 – 我不记得)不包括北爱尔兰的数据,因为军械测量局在那里没有任何职责。 在北爱尔兰的测绘是由北爱尔兰的军械测量局进行的,他们有单独的,付费的指示器产品。 你可以使用这个,并附加一些不太容易覆盖的东西。

  • 皇家邮政发布邮政编码地址文件(PAF) ,这包括我不确定代码点打开做的BFPO。 它定期更新,但花钱(有时他们可能是彻头彻尾的意思)。 PAF包括完整的地址,而不仅仅是邮编,并附有自己的程序员指南 。 开放数据用户组(ODUG)目前正在游说PAF免费发布, 这里是他们的立场的描述 。

  • 最后,有AddressBase 。 这是军械测量局,地方当局,皇家邮政和一个配套公司之间的合作,为所有英国地址(他们已经相当成功)创build了一个确切的目录。 这是付费的,但是如果你正在与地方当局,政府部门或政府部门合作,那么他们可以免费使用。 有很多信息比只包括邮编更多。

我查看了上面的一些答案,并build议不要使用@ Dan的答案(c。Dec 15 '10)的模式 ,因为它错误地将几乎0.4%的有效邮政编码标记为无效,而其他邮件。

军械测量局提供的服务称为代码点公开:

包含英国所有当前邮政编码单位的列表

我使用grep从这个数据中运行了上面的每个正则expression式(7月613)

 cat CSV/*.csv | # Strip leading quotes sed -e 's/^"//g' | # Strip trailing quote and everything after it sed -e 's/".*//g' | # Strip any spaces sed -E -e 's/ +//g' | # Find any lines that do not match the expression grep --invert-match --perl-regexp "$pattern" 

共有1,686,202个邮编。

以下是与每个$pattern 匹配的有效邮编数量:

 '^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]?[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$' # => 6016 (0.36%) 
 '^(GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]([0-9ABEHMNPRV-Y])?)|[0-9][A-HJKPS-UW]) ?[0-9][ABD-HJLNP-UW-Z]{2})$' # => 0 
 '^GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|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}$' # => 0 

当然,这些结果只能处理错误标记为无效的有效邮政编码。 所以:

 '^.*$' # => 0 

我没有说什么模式是最好的关于过滤出无效的邮政编码。

 ^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$ 

正则expression式匹配有效的英国邮政编码。 在英国的邮政系统中,不是所有的字母都用在所有的位置上(与车辆牌照相同),并且有不同的规则来pipe理这个。 这个正则expression式考虑到这些规则。 规则细节:前一半的邮编有效格式[AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [0-9] [0-9] [AZ] [0-9] [ 0-9] [AZ] [AZ] [0-9] [AZ] [AZ] [AZ] [AZ] [0-9] [AZ] [AZ] [0-9] Contraint – QVX未使用位置 – 秒。 Contraint – IJZ在GIR 0AA Position – Third中没有使用。 约束 – AEHMNPRTVXY只使用Position – Forth。 Contraint – ABEHMNPRVWXY后一半的邮编有效格式[0-9] [AZ] [AZ]例外位置 – 第二和第三。 Contraint – CIKMOV未使用

http://regexlib.com/REDetails.aspx?regexp_id=260

这里的大部分答案都不适用于我在数据库中的所有邮编。 我终于find了一个与所有的validation,使用政府提供的新的正则expression式:

Bulk_Data_Transfer_-_additional_validation_valid_from_12_November_2015.pdf

这是不是在任何以前的答案,所以我张贴在这里万一他们采取链接:

 ^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$ 

更新:正如杰米·布尔指出的更新正则expression式。 不知道这是我的错误复制,或者这是政府的正则expression式中的错误,链接现在是失败的…

一个旧的post,但仍然相当高的谷歌结果,所以想我会更新。 这个10月14日的文件定义英国邮政编码的正则expression式为:

(([A-Za-z] [0-9] {1,2})|(([A-Za-z] (A-Za-z])[(A-Za-z])|([A-Za-z] z] [A-Ha-hJ-Yj-y] [0-9]?[A-Za-z]))))[0-9] [A-Za-z] {2})$

从:

Bulk_Data_Transfer_-_additional_validation_valid_from_12_November_2015.pdf

该文件还解释了背后的逻辑。 然而,它有一个错误(粗体),也允许小写,这虽然是不正常的,所以修改后的版本:

 ^(GIR 0AA)|((([AZ][0-9]{1,2})|(([AZ][A-HJ-Y][0-9]{1,2})|(([AZ][0-9][AZ])|([AZ][A-HJ-Y][0-9]?[AZ])))) [0-9][AZ]{2})$ 

这适用于以前的版本没有的新的伦敦邮政编码(例如W1D 5LH)。

根据这个维基百科表

在这里输入图像描述

这种模式涵盖了所有的情况

 (?:[A-Za-z]\d ?\d[A-Za-z]{2})|(?:[A-Za-z][A-Za-z\d]\d ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d{2} ?\d[A-Za-z]{2})|(?:[A-Za-z]\d[A-Za-z] ?\d[A-Za-z]{2})|(?:[A-Za-z]{2}\d[A-Za-z] ?\d[A-Za-z]{2}) 

在Android \ Java上使用时使用\\ d

我一直在寻找英国邮政编码正则expression式的最后一天左右,偶然发现这个线程。 我按照上面的大部分build议工作,并没有一个为我工作,所以我想出了我自己的正则expression式,据我所知,截至2013年1月,所有有效的英国邮政编码(根据最新的文献皇家邮政)。

正则expression式和一些简单的邮政编码检查PHP代码张贴如下。 注意: – 它允许使用较小或大写的邮政编码和GIR 0AAexception,但要处理input的邮政编码中间空间的可能性,也可以使用简单的str_replace在testing之前删除空间对正则expression式。 除此之外的任何差异和皇家邮政本身甚至没有在他们的文献中提及(参见http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf并从第17页开始阅读); !

注:在皇家邮政自己的文献(上面的链接)围绕第三和第四个职位有一个模糊的含义,如果这些字符是字母,则有例外。 我直接联系了皇家邮政,并用他们自己的话说:“AANA的NAA格式的第4位的信函NAA没有例外,第3位的例外只适用于出口代码的最后一个字母,格式全日空NAA“。 直接从马的嘴巴!

 <?php $postcoderegex = '/^([g][i][r][0][a][a])$|^((([a-pr-uwyz]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[a-hk-y]{1}([0]|[1-9]\d?))|([a-pr-uwyz]{1}[1-9][a-hjkps-uw]{1})|([a-pr-uwyz]{1}[a-hk-y]{1}[1-9][az]{1}))(\d[abd-hjlnp-uw-z]{2})?)$/i'; $postcode2check = str_replace(' ','',$postcode2check); if (preg_match($postcoderegex, $postcode2check)) { echo "$postcode2check is a valid postcode<br>"; } else { echo "$postcode2check is not a valid postcode<br>"; } ?> 

我希望它可以帮助任何遇到此线程的人寻找解决scheme。

邮政编码可能会发生变化,validation邮政编码的唯一方法是获取邮政编码的完整列表,看看它是否在那里。

但正则expression式是有用的,因为它们:

  • 易于使用和实施
  • 很短
  • 快速运行
  • 很容易维护(与完整的邮编列表相比)
  • 仍然捕捉大部分input错误

但正则expression式往往难以维持,特别是对于一开始就没有拿出来的人来说。 所以它必须是:

  • 尽可能容易理解
  • 相对未来的certificate

这意味着这个答案中的大部分正则expression式都不够好。 例如,我可以看到[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]将会匹配一个AA1Aforms的邮编区域 – 但这将会是一个痛苦脖子,如果当一个新的邮政编码区域被添加,因为它很难理解它匹配的邮政编码区域。

我也希望我的正则expression式匹配邮编的第一个和第二个一半作为括号匹配。

所以我想出了这个:

 (GIR(?=\s*0AA)|(?:[BEGLMNSW]|[AZ]{2})[0-9](?:[0-9]|(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])[A-HJ-NP-Z])?)\s*([0-9][ABD-HJLNP-UW-Z]{2}) 

在PCRE格式中可以写成如下:

 /^ ( GIR(?=\s*0AA) # Match the special postcode "GIR 0AA" | (?: [BEGLMNSW] | # There are 8 single-letter postcode areas [AZ]{2} # All other postcode areas have two letters ) [0-9] # There is always at least one number after the postcode area (?: [0-9] # And an optional extra number | # Only certain postcode areas can have an extra letter after the number (?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9]) [A-HJ-NP-Z] # Possible letters here may change, but [IO] will never be used )? ) \s* ([0-9][ABD-HJLNP-UW-Z]{2}) # The last two letters cannot be [CIKMOV] $/x 

对于我来说,这是在尽可能多的validation之间的正确平衡,同时又能够保证未来的发展并且易于维护。

这是Google在其i18napis.appspot.com域名上提供的正则expression式:

 GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|BX|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} 

这是一个基于marcj的答案文档中指定的格式的正则expression式:

 /^[AZ]{1,2}[0-9][0-9A-Z]? ?[0-9][AZ]{2}$/ 

和规格的唯一区别就是根据规格最后2个字符不能在[CIKMOV]中。

编辑:这是另一个版本,testing尾随的字符限制。

 /^[AZ]{1,2}[0-9][0-9A-Z]? ?[0-9][A-BD-HJLNP-UW-Z]{2}$/ 

上面的一些正则expression式有一点限制。 请注意,真正的邮政编码:“W1K 7AA”将失败,因为规则“位置3 – AEHMNPRTVXY只用于”上面的“K”将被禁止。

正则expression式:

 ^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKPS-UW])[0-9][ABD-HJLNP-UW-Z]{2})$ 

似乎更准确一些,请参阅维基百科的文章“英国的邮编” 。

请注意,这个正则expression式只需要大写字符。

更大的问题是,您是否限制用户input以仅允许实际存在的邮政编码,或者您是否只是试图阻止用户在表单字段中input完整垃圾。 正确匹配每一个可能的邮政编码,以及将来打样,这是一个难题,除非你是HMRC,否则不值得。

前一半的邮编有效格式

  • [AZ] [AZ] [0-9] [AZ]
  • [AZ] [AZ] [0-9] [0-9]
  • [AZ] [0-9] [0-9]
  • [AZ] [AZ] [0-9]
  • [AZ] [AZ] [AZ]
  • [AZ] [0-9] [AZ]
  • [AZ] [0-9]

例外
位置1 – QVX未使用
位置2 – IJZ不在GIR 0AA中使用
位置3 – 仅使用AEHMNPRTVXY
职位4 – ABEHMNPRVWXY

邮政编码的后半部分

  • [0-9] [AZ] [AZ]

例外
位置2 + 3 – 不使用CIKMOV

记住并不是所有可能的代码都被使用,所以这个列表对于一个有效的代码来说是一个必要但不够的条件。 匹配所有有效代码的列表可能更容易?

根据皇家邮政的程序员指南,检查邮政编码的格式是有效的 :

  |----------------------------outward code------------------------------| |------inward code-----| #special↓ α1 α2 AAN AANA AANN AN ANN ANA (α3) N AA ^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][AZ]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) [0-9][ABD-HJLNP-UW-Z]{2})$ 

所有doogal.co.uk匹配的邮编,除了那些不再使用的邮件 。

添加一个? 经过空间和使用大小写不敏感的匹配来回答这个问题:

 'se50eg'.match(/^(GIR 0AA|[A-PR-UWYZ]([A-HK-Y]([0-9][AZ]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2})$/ig); Array [ "se50eg" ] 

我使用以下正则expression式来testing所有有效的英国邮政编码。 它基于推荐的规则,但尽可能合理地压缩,不使用任何特定语言特定的正则expression式规则。

 ([A-PR-UWYZ]([A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y])?|[0-9]([0-9]|[A-HJKPSTUW])?) ?[0-9][ABD-HJLNP-UW-Z]{2}) 

它假定邮政编码已经被转换成大写,并且没有前导字符或尾随字符,但是将接受outcode和incode之间的可选空间。

特殊的“GIR0 0AA”邮政编码被排除在外,不会被validation,因为它不在邮政局的官方邮局列表中,而且据我所知,它不会被用作注册地址。 如果需要,添加它应该是一个小例子。

如果你不想失败validation,然后修剪它的一面,这个允许从双方的空白空间和标签。

 ^\s*(([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) {0,1}[0-9][A-Za-z]{2})\s*$) 

基本规则:

 ^[AZ]{1,2}[0-9R][0-9A-Z]? [0-9][ABD-HJLNP-UW-Z]{2}$ 

英国的邮政编码(或称邮政编码)由五到七个由空格分隔的字母数字字符组成。 涵盖哪些angular色可以出现在特定位置的规则相当复杂,充满了例外。 刚刚显示的正则expression式因此坚持基本规则。

完整的规则:

如果您需要一个正则expression式,以可读性为代价来勾选邮政编码规则的所有方框,您可以这样做:

 ^(?:(?:[A-PR-UWYZ][0-9]{1,2}|[A-PR-UWYZ][A-HK-Y][0-9]{1,2}|[A-PR-UWYZ][0-9][A-HJKSTUW]|[A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y]) [0-9][ABD-HJLNP-UW-Z]{2}|GIR 0AA)$ 

资料来源: https : //www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html

testing对我们的客户数据库,似乎是完全准确的。

要添加到这个列表中,我使用的更实用的正则expression式允许用户input一个empty string

 ^$|^(([gG][iI][rR] {0,}0[aA]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,1}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$ 

这个正则expression式允许大写和小写字母之间的可选空间

从软件开发人员的angular度来看,这个正则expression式对于地址可能是可选的软件是有用的。 例如,如果用户不想提供他们的地址细节

看看这个页面上的python代码:

http://www.brunningonline.net/simon/blog/archives/001292.html

我有一些邮编parsing来做。 这个要求很简单, 我必须parsing一个邮编到outcode和(可选)incode。 好的新function是我不必进行任何validation – 我只需要以模糊的方式切断我提供的内容。 在格式化方面,我不能假设我的导入,即case和embedded式空间。 但这不是坏消息; 坏消息是我必须在RPG中做到这一切。 🙁

不过,我一起扔了一点Python函数来澄清我的想法。

我用它来为我处理邮编。

我们有一个规范:

 英国邮政编码必须采用以下forms之一(有一个例外,见下文): 
     §99AA 
     §A99 9AA
     §AA9 9AA
     §AA99 9AA
     §A9A 9AA
     §AA9A 9AA
其中A代表字母字符,9代表数字字符。
其他规则适用于字母字符,如下所示:
     §位置1的字符不能是Q,V或X
     §位置2中的字符可能不是I,J或Z
     §位置3的字符可能不是I,L,M,N,O,P,Q,R,V,X,Y或Z
     §位置4的字符可能不是C,D,F,G,I,J,K,L,O,Q,S,T,U或Z
     §最右边两个位置的字符可能不是C,I,K,M,O或V.
不符合这些一般规则的例外是邮政编码“GIR 0AA”,这是一个特殊的有效邮政编码。 

我们想出了这个:

 /^([A-PR-UWYZ][A-HK-Y0-9](?:[A-HJKS-UW0-9][ABEHMNPRV-Y0-9]?)?\s*[0-9][ABD-HJLNP-UW-Z]{2}|GIR\s*0AA)$/i 

但请注意 – 这允许组之间的任何数量的空间。

我有英国邮政编码validation的正则expression式。

这适用于所有types的邮政编码内部或外部

 ^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))) || ^((GIR)[ ]?(0AA))$|^(([A-PR-UWYZ][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][0-9][A-HJKS-UW0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$|^(([A-PR-UWYZ][A-HK-Y0-9][0-9][ABEHMNPRVWXY0-9])[ ]?([0-9][ABD-HJLNPQ-UW-Z]{0,2}))$ 

这适用于所有types的格式。

例:

AB10 ——————–>只有外面的电话号码

A1 1AA ——————>(外部和内部)POSTCODE的组合

WC2A ——————–> OUTER

以下是我们如何处理英国邮政编码问题:

 ^([A-Za-z]{1,2}[0-9]{1,2}[A-Za-z]?[ ]?)([0-9]{1}[A-Za-z]{2})$ 

说明:

  • 预计1或2个字符,上限或下限罚款
  • 期望1或2个数字
  • 期望0或1个字符,上限或下限罚款
  • 可选的空间允许
  • 预计1号码
  • 期望2 az,上限或下限罚款

这得到了大多数格式,然后我们使用db来validation邮编是否真的是实际的,这个数据是由openpoint https://www.ordnancesurvey.co.uk/opendatadownload/products.html

希望这可以帮助

接受的答案反映了皇家邮政给出的规则,尽pipe在正则expression式中有一个错字。 这个错字似乎也在gov.uk网站上(就像在XML存档页面中一样)。

在格式A9A 9AA规则允许P字符在第三个位置,而正则expression式不允许这个。 正确的正则expression式是:

 (GIR 0AA)|((([AZ-[QVX]][0-9][0-9]?)|(([AZ-[QVX]][AZ-[IJZ]][0-9][0-9]?)|(([AZ-[QVX]][0-9][A-HJKPSTUW])|([AZ-[QVX]][AZ-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][AZ-[CIKMOV]]{2}) 

缩短这个结果在下面的正则expression式(使用Perl / Ruby语法):

 (GIR 0AA)|([A-PR-UWYZ](([0-9]([0-9A-HJKPSTUW])?)|([A-HK-Y][0-9]([0-9ABEHMNPRVWXY])?))\s?[0-9][ABD-HJLNP-UW-Z]{2}) 

它还包括第一个和第二个块之间的可选空间。

在这里你可以find一些有用的链接,取决于你使用的是什么语言:

http://www.ukpostcode.net/wiki/develop

我需要一个可以在PRXMATCH和相关函数中使用SAS的版本,所以我想出了这个:

 ^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$ 

testing用例和注释:

 /* Notes The letters QVX are not used in the 1st position. The letters IJZ are not used in the second position. The only letters to appear in the third position are ABCDEFGHJKPSTUW when the structure starts with A9A. The only letters to appear in the fourth position are ABEHMNPRVWXY when the structure starts with AA9A. The final two letters do not use the letters CIKMOV, so as not to resemble digits or each other when hand-written. */ /* Bits and pieces 1st position (any): [A-PR-UWYZ] 2nd position (if letter): [A-HK-Y] 3rd position (A1A format): [A-HJKPSTUW] 4th position (AA1A format): [ABEHMNPRV-Y] Last 2 positions: [ABD-HJLNP-UW-Z] */ data example; infile cards truncover; input valid 1. postcode &$10. Notes &$100.; flag = prxmatch('/^[A-PR-UWYZ](([A-HK-Y]?\d\d?)|(\d[A-HJKPSTUW])|([A-HK-Y]\d[ABEHMNPRV-Y]))\s?\d[ABD-HJLNP-UW-Z]{2}$/',strip(postcode)); cards; 1 EC1A 1BB Special case 1 1 W1A 0AX Special case 2 1 M1 1AE Standard format 1 B33 8TH Standard format 1 CR2 6XH Standard format 1 DN55 1PT Standard format 0 QN55 1PT Bad letter in 1st position 0 DI55 1PT Bad letter in 2nd position 0 W1Z 0AX Bad letter in 3rd position 0 EC1Z 1BB Bad letter in 4th position 0 DN55 1CT Bad letter in 2nd group 0 A11A 1AA Invalid digits in 1st group 0 AA11A 1AA 1st group too long 0 AA11 1AAA 2nd group too long 0 AA11 1AAA 2nd group too long 0 AAA 1AA No digit in 1st group 0 AA 1AA No digit in 1st group 0 A 1AA No digit in 1st group 0 1A 1AA Missing letter in 1st group 0 1 1AA Missing letter in 1st group 0 11 1AA Missing letter in 1st group 0 AA1 1A Missing letter in 2nd group 0 AA1 1 Missing letter in 2nd group ; run;