当前位置 : 首页 » 互动问答 » 正文

英国邮政编码正则表达(综合)

分类 : 互动问答 | 发布时间 : 2008-10-03 07:05:03 | 评论 : 29 | 浏览 : 136345 | 喜欢 : 139

我正在使用正则表达式,它将仅在输入字符串中验证完整复杂的英国邮政编码。所有不常见的邮政编码表格都必须与通常一样。例如:

Matches

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

No Match

  • aWC2H 7LT
  • WC2H 7LTa
  • WC2H

是否有任何官方甚至半官方的正则表达式用于此类事情?关于格式化和存储在数据库中的任何其他建议?

回答(29)

  • 1楼
  • 我建议你看一下英国政府数据标准的邮政编码[链接已经死了; XML存档, see Wikipedia供讨论]。有关于数据的简要描述,附加的xml架构提供了正则表达式。它可能不是你想要的,但它将是一个很好的起点。 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开头)并且它们确实提供了一个你可以尝试的更严格的测试。

  • 2楼
  • 看起来我们将要使用 ^(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上面提到的一个稍微修改过的版本。

    但是,我们将不得不仔细调查规则是什么,因为上面列出的各种解决方案似乎对允许哪些字母应用不同的规则。

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

    我们已经采取了这种方式并对其进行了一些处理,以便为我们提供以下表达式:

     ^((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,}表示无限空格)。它假定所有文本必须为大写。

    如果要允许小写,任意数量的空格,请使用:

     ^(([gG] [iI] [rR] {0,} 0 [ AA] {2})|((([A-PR-uwyzA-PR-UWYZ] [A-HK-YA-HK-Y] [0-9] [0-9])|?((一个-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

    Where:

    • 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.

    祝福

    Colin

  • 3楼
  • 没有全面的英国邮政编码正则表达式能够validating邮政编码。您可以使用正则表达式检查邮政编码是否格式正确;不是它确实存在。

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

    你不能指望目前永远存在的是什么。例如,在1990年,邮局决定阿伯丁变得有点拥挤。他们在AB1-5的末尾添加了0,使其成为AB10-50,然后在这些之间创建了许多邮政编码。

    每当构建新街道时,都会创建一个新的邮政编码。这是获得构建许可的过程的一部分;地方当局有义务在邮局更新(不是他们都这样做)。

    此外,正如其他一些用户所指出的那样,有特殊的邮政编码,如Girobank,GIR 0AA和一个用于信件的邮政编码。对圣诞老人,SAN TA1 - 您可能不想在那里发布任何内容,但它似乎没有被任何其他答案所涵盖。

    然后,有BFPO邮政编码,现在是更改为更标准格式。两种格式都有效。最后,海外地区来源Wikipedia .

    + ---------- + -------------------------------------- -------- +
    |邮政编码|位置|
    + ---------- + -------------------------------------- -------- +
    | 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 |特克斯和凯科斯群岛|
    + ---------- + -------------------------------------- -------- + 

    接下来,您必须考虑到英国将其邮政编码系统“导出”到世界上许多地方。验证“UK”邮政编码的任何内容也将验证其他许多国家/地区的邮政编码。

    如果您想validate英国邮政编码,最安全的方法是使用当前邮政编码的查找。有许多选项:

    • Ordnance Survey在开放数据许可下发布 Code-Point Open 。它将落后于时代,但它是免费的。这将(可能 - 我不记得)不包括北爱尔兰的数据,因为军械测量局没有在那里。北爱尔兰的地图由北爱尔兰的军械测量局进行,他们有单独的,付费的,Pointer产品。您可以使用此功能并附加少量未被轻易覆盖的内容。

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

    • 最后,有 AddressBase 。这是Ordnance Survey,地方当局,皇家邮政和匹配公司之间的合作,以创建关于所有英国地址的所有信息的最终目录(它们也相当成功)。这是付费的,但如果您与地方当局,政府部门或政府服务部门合作,他们可以免费使用。除了包含的邮政编码之外,还有更多的信息。

  • 4楼
  • 我查看了上面的一些答案,我建议不要使用来自@ Dan的回答(c。2010年12月15日)的模式,因为它错误地将几乎0.4%的有效邮政编码标记为无效,而其他人则没有。

    Ordnance Survey提供名为Code Point Open的服务:

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

    我运行了上面的每个正则表达式使用grep:

     cat CSV / * .csv |从此数据中删除完整的邮政编码列表(2013年7月6日)。
        #剥离引号
        sed -e's / ^“// g'|
        #删除尾随报价及其后的所有内容
        sed -e's /".*// g'|
        #剥去任何空格
        sed -E -e's / + // g'|
        #查找与表达式不匹配的所有行
        grep --invert-match --perl-regexp“$ pattern”
    

    共有1,686,202个邮政编码。

    以下是not match each $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 |点| CT |简历| CW | DA | DD | DE | DG | DH | DL | DN | DT | DY | E | EC | EH | EN | EX | FK |风云| G | GL | GY | GU | HA | HD | HG | HP | HR | HS |胡| HX | IG | IM | IP | IV | JE | KA | KT | KW | KY | L | LA | LD |乐| LL | LN | LS |陆| 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
    

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

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

    正则表达式以匹配有效的UK   邮政编码。在英国的邮政系统没有   所有字母都用于所有位置   (与车辆登记相同   (并且有各种规则)   治理这个。这个正则表达式考虑到了   说明这些规则。细节   规则:邮政编码的前半部分有效   格式[A-Z] [A-Z] [0-9] [A-Z]   [A-Z] [A-Z] [0-9] [0-9] [A-Z] [0-9] [0-9]   [A-Z] [A-Z] [0-9] [A-Z] [A-Z] [A-Z]   [A-Z] [0-9] [A-Z] [A-Z] [0-9]例外   位置 - 第一。约束 - QVX没有   使用位置 - 第二。约束 -   IJZ除GIR 0AA外没有使用过   立场 - 第三。约束 -   AEHMNPRTVXY仅使用位置 -   向前。约束 - ABEHMNPRVWXY第二   邮政编码的一半有效格式   [0-9] [A-Z] [A-Z]例外位置 -   第二和第三。 Contraint - CIKMOV   未使用

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

  • 6楼
  • 这里的大部分答案都不适用于我在数据库中的所有邮政编码。我终于找到了一个使用政府提供的新正则表达式验证的所有内容:

    https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/413338/Bulk_Data_Transfer_-_additional_validation_valid_from_March_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})$
    

    更新:Jamie Bull指出的更新的正则表达式。不确定这是我的错误复制还是政府正则表达式中的错误,链接现在已经关闭...

    更新:正如ctwheels发现的,这个正则表达式适用于javascript正则表达式。看看他对pcre(php)风格的评论。

  • 7楼
  • 一个旧的帖子,但仍然相当高的谷歌结果所以认为我会更新。这个10月14日的文档将英国邮政编码正则表达式定义为:

     ^([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})|(([** ** AZ AZ] [ 0-9] [A-Za-z])|([A-Za-z] [A-Ha-hJ-Yj-y] [0-9]?[A-Za-z]))))[ 0-9] [A-ZA-Z] {2})$
    

    from:

    https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.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)。

  • 8楼
  • 根据这个维基百科表

    enter image description here

    这个模式涵盖所有案例

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

  • 9楼
  • 邮政编码可能会发生变化,验证邮政编码的唯一真正方法是拥有完整的邮政编码列表,看看它是否存在。

    但正则表达式很有用,因为它们:

    • 易于使用和实现< notranslate>快速运行
    • are short
    • 非常容易维护(与完整的邮政编码列表相比)
    • 仍然可以捕获大多数输入错误
    • 但正则表达式往往难以维护,特别是对于那些没有做过的人首先想出来。所以它必须是:

    尽可能容易理解

    • 相对未来的证明
    • 这意味着这个答案中的大多数正则表达式都不够好。例如。我可以看到

    将匹配AA1A形式的邮政编码区域 - 但是如果添加新的邮政编码区域,那将会是一个痛苦的问题,因为很难理解它匹配的邮政编码区域。 我还希望我的正则表达式匹配邮政编码的前半部分和后半部分作为括号匹配。 [A-PR-UWYZ] [A-HK-Y] [0-9] [ABEHMNPRV-Y]

    所以我想出了这个:

    (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)#匹配特殊邮政编码“GIR 0AA”     |     (?:       [BEGLMNSW] | #有8个单字母邮编区域       [A-Z] {2}#所有其他邮政编码区域有两个字母       )     [0-9]#邮政编码区域后面始终至少有一个数字     (?:       [0-9]#和一个可选的额外号码       |       #只有某些邮编区域可以在号码后面加一个额外的字母       (<= N1 |?E1 | SE1 | SW1 | W1 | NW1 | EC [0-9] | WC [0-9])       [A-HJ-NP-Z]#此处可能的字母可能会更改,但永远不会使用[IO]       )?     )   \ S *   ([0-9] [ABD-HJLNP-UW-Z] {2})#最后两个字母不能是[CIKMOV] $ / X

    对我来说,这是在尽可能多地验证,同时进行未来验证和便于维护之间的正确平衡。

    For me this is the right balance between validating as much as possible, while at the same time future-proofing and allowing for easy maintenance.

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

    正则表达式和一些简单的邮政编码检查PHP代码发布如下。注意: - 它允许使用较低或大写的邮政编码和GIR 0AA异常,但是为了处理输入的邮政编码中间的空间,很可能还会使用简单的str_replace来删除测试前的空间反对正则表达式。任何超出此范围的差异和皇家邮政本身甚至都没有在他们的文献中提及它们(参见 http://www.royalmail.com/sites/default/files/ docs / pdf / programmers_guide_edition_7_v5.pdf 并从第17页开始阅读)!

    Note:在皇家邮政自己的文献(上面的链接)中,如果这些字符是字母,则第3和第4个位置存在轻微的歧义,并且存在例外情况。我直接联系了皇家邮政,并用他们自己的话说明了“Award NAA格式的外向代码第4位的信件没有例外,第3个位置例外仅适用于”外展代码“的最后一个字母。格式ANA 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是一个有效的邮政编码<br>”;
    
        } else {
    
            echo“$ postcode2check不是有效的邮政编码<br>”;
    
        }
    
    ?>
    

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

  • 11楼
  • 这是谷歌在他们的 i18napis.appspot.com domain:

     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 |风云| G | GL | GY | GU | HA | HD | HG | HP | HR | HS |胡| 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}
  • 12楼
  • 这是一个正则表达式,基于文档中指定的格式,链接到marcj的答案:

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

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

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

     / ^ [A-Z] {1,2} [0-9] [0-9A-Z]? ?[0-9] [A-BD-HJLNP-UW-Z] {2} $ /
  • 13楼
  • 上面的一些正则表达式有点限制。注意真正的邮政编码:“W1K 7AA”将失败,因为上面的规则“位置3 - 仅使用AEHMNPRTVXY”,因为“K”将被禁止。

    the regex:

     ^(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})$
    

    似乎更准确一点,请参阅维基百科文章“英国邮政编码”.

    请注意,此正则表达式只需要大写字符。

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

  • 14楼
  • 基本规则:

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

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

    完整规则:

    如果您需要一个以可读性为代价勾选邮政编码规则的所有框的正则表达式,请转到:

     ^( ?:(:[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)$
    

    Source: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s16.html

    针对我们的客户数据库进行测试,看起来非常准确。

  • 15楼
  • 邮政编码的前半部分有效格式

    • [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] <notranslate > 位置1 - 未使用QVX
    • [A-Z][0-9]

    Exceptions
    位置2 - 除了GIR 0AA
    之外,未使用IJZ 位置3 - AEHMNPRTVXY仅使用
    位置4 - ABEHMNPRVWXY
    邮政编码的后半部分

    [0-9] [A-Z] [A-Z]

    • 位置2 + 3 - 未使用CIKMOV

    Exceptions
    请记住并非使用所有可能的代码,因此该列表对于有效代码是必要但不充分的条件。可能更容易匹配所有有效代码的列表?

    Remember not all possible codes are used, so this list is a necessary but not sufficent condition for a valid code. It might be easier to just match against a list of all valid codes?

  • 16楼
  • 根据皇家邮政的程序员指南:

     | ---------------------------检查邮政编码的格式是否有效 - 代码------------------------------ | | ------内向代码----- |
    #special↓α1α2ANANAANA 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 上的所有邮政编码都匹配,除了那些不再使用的邮件。

    Adding a ?在空格后并使用不区分大小写的匹配来回答这个问题:

    '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);
    数组[“se50eg”]
  • 17楼
  • 我使用以下正则表达式,我测试了所有有效的英国邮政编码。它基于推荐的规则,但是尽可能合理,并且不使用任何特殊语言特定的正则规则。

    ([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”邮政编码被排除在外,不会验证为它不在官方邮局的邮政编码列表中,据我所知,不会被用作注册地址。如果需要,添加它应该是一个特殊情况。

  • 18楼
  • 这个允许来自两侧的空格和制表符,以防你不想失败验证然后修剪它的服务器端。

     ^ \ 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 * $)
  • 19楼
  • 以下是我们处理英国邮政编码问题的方法:

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

    说明:

    • 期望1或2个az字符,上限或下限
    • 期望1或2个数字
    • 期望0或1个az char,上限或下限
    • 允许的可选空间
    • 期望1个数字
    • 期望2个az,上部或下部精细

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

    希望这会有所帮助

  • 20楼
  • 要添加到此列表,我使用的更实用的正则表达式允许用户输入空字符串 is:

     ^ $ | ^(([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}))$
    

    此正则表达式允许大写和小写字母之间有一个可选空格

    从软件开发人员的角度来看,这个正则表达式对于地址可选的软件非常有用。例如,如果用户不想提供他们的地址详细信息

  • 21楼
  • 我想要一个简单的正则表达式,允许太多,但不要拒绝有效的邮政编码。我选择了这个(输入是一个剥离/修剪过的字符串):

    / ^([A-Z0-9] \ S *){5,7} $ / I

    长度5到7(不计空格)意味着我们允许最短的邮政编码,如“L1 8JQ”以及最长的邮编,如“OL14 5ET”。

    编辑:将8更改为7,所以我们不要不允许使用8个字符的邮政编码。

  • 22楼
  • 看看这个页面上的python代码:

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

    我有一些邮政编码解析要做。要求非常简单;我必须将邮政编码解析为outcode和(可选)incode。好消息是我不需要进行任何验证 - 我只需要以模糊的方式切断我所提供的内容。在格式化方面,我无法假设我的导入,即大小写和嵌入空格。但这不是坏消息;坏消息是我必须在RPG中完成所有操作。 : - (

    然而,我把一些Python函数放在一起以澄清我的想法。

    我用它来处理我的邮政编码。

  • 23楼
  • 我有英国邮政编码验证的正则表达式。

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

     ^((([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}))$
    

    这适用于所有类型的格式。

    Example:

    AB10 --------------------> ONLY OUTER POSTCODE

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

    WC2A --------------------> OUTER

  • 24楼
  • 我们获得了一个规范:

    英国邮政编码必须采用以下形式之一(有一个例外,见下文):
        §A99AA
        §A999AA
        §AA99AA
        §AA999AA
        §A9A9AA
        §AA9A9AA
    其中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
    

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

  • 25楼
  • 接受的答案反映了皇家邮政的规则,尽管正则表达中存在拼写错误。这个错字似乎也出现在gov.uk网站上(就像它在XML存档页面中一样)。

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

    (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})
    

    缩短这会产生以下正则表达式(使用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})
    

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

  • 27楼
  • 我在几乎所有的变化和大规模转移pdf的正则表达式以及维基百科网站上的内容中找到的是这个,特别是对于维基百科正则表达式,在第一个|(垂直条)之后需要有^。我通过测试AA9A 9AA来解决这个问题,因为否则A9A 9AA的格式检查将验证它。例如检查EC1D 1BB应该是无效的,因为C1D 1BB是一个有效的格式。

    这是我为一个好的正则表达式提出的:

     ^([G] [I] [ R] 0 [A] {2})| ^(([[AZ- [QVX]] [0-9] {1,2})|([AZ- [QVX]] [A-HK-Y] [ 0-9] {1,2})|([AZ-[QVX]] [0-9] [ABCDEFGHJKPSTUW])|([AZ-[QVX]] [A-HK-Y] [0-9] [ ABEHMNPRVWXY]))[0-9] [AZ- [CIKMOV]] {2})$
  • 28楼
  • I recently posted an answer to this question on UK postcodes for the R language. I discovered that the UK Government's regex pattern is incorrect and fails to properly validate some postcodes. Unfortunately, many of the answers here are based on this incorrect pattern.

    I'll outline some of these issues below and provide a revised regular expression that actually works.


    Note

    My answer (and regular expressions in general):

    • Only validates postcode formats.
    • Does not ensure that a postcode legitimately exists.
      • For this, use an appropriate API! See Ben's answer for more info.

    The Bad Regex

    The regular expressions in this section should not be used.

    This is the failing regex that the UK government has provided developers (not sure how long this link will be up, but you can see it in their Bulk Data Transfer documentation):

    ^([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})|(([AZa-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})$
    

    Problems

    Problem 1 - Copy/Paste

    See regex in use here.

    As many developers likely do, they copy/paste code (especially regular expressions) and paste them expecting them to work. While this is great in theory, it fails in this particular case because copy/pasting from this document actually changes one of the characters (a space) into a newline character as shown below:

    ^([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})|(([AZa-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})$
    

    The first thing most developers will do is just erase the newline without thinking twice. Now the regex won't match postcodes with spaces in them (other than the GIR 0AA postcode).

    To fix this issue, the newline character should be replaced with the space character:

    ^([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})|(([AZa-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})$
                                                                                                                                                         ^
    

    Problem 2 - Boundaries

    See regex in use here.

    ^([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})|(([AZa-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})$
    ^^                     ^ ^                                                                                                                                            ^^
    

    The postcode regex improperly anchors the regex. Anyone using this regex to validate postcodes might be surprised if a value like fooA11 1AA gets through. That's because they've anchored the start of the first option and the end of the second option (independently of one another), as pointed out in the regex above.

    What this means is that ^ (asserts position at start of the line) only works on the first option ([Gg][Ii][Rr] 0[Aa]{2}), so the second option will validate any strings that end in a postcode (regardless of what comes before).

    Similarly, the first option isn't anchored to the end of the line $, so GIR 0AAfoo is also accepted.

    ^([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})|(([AZa-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})$
    

    To fix this issue, both options should be wrapped in another group (or non-capturing group) and the anchors placed around that:

    ^(([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})|(([AZa-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}))$
    ^^                                                                                                                                                                      ^^
    

    Problem 3 - Improper Character Set

    See regex in use here.

    ^([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})|(([AZa-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})$
                                                                                           ^^
    

    The regex is missing a - here to indicate a range of characters. As it stands, if a postcode is in the format ANA NAA (where A represents a letter and N represents a number), and it begins with anything other than A or Z, it will fail.

    That means it will match A1A 1AA and Z1A 1AA, but not B1A 1AA.

    To fix this issue, the character - should be placed between the A and Z in the respective character set:

    ^([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})$
                                                                                            ^
    

    Problem 4 - Wrong Optional Character Set

    See regex in use here.

    ^([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})|(([AZa-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})$
                                                                                                                                            ^
    

    I swear they didn't even test this thing before publicizing it on the web. They made the wrong character set optional. They made [0-9] option in the fourth sub-option of option 2 (group 9). This allows the regex to match incorrectly formatted postcodes like AAA 1AA.

    To fix this issue, make the next character class optional instead (and subsequently make the set [0-9] match exactly once):

    ^([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})|(([AZa-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})$
                                                                                                                                                    ^
    

    Problem 5 - Performance

    Performance on this regex is extremely poor. First off, they placed the least likely pattern option to match GIR 0AA at the beginning. How many users will likely have this postcode versus any other postcode; probably never? This means every time the regex is used, it must exhaust this option first before proceeding to the next option. To see how performance is impacted check the number of steps the original regex took (35) against the same regex after having flipped the options (22).

    The second issue with performance is due to the way the entire regex is structured. There's no point backtracking over each option if one fails. The way the current regex is structured can greatly be simplified. I provide a fix for this in the Answer section.

    Problem 6 - Spaces

    See regex in use here

    This may not be considered a problem, per se, but it does raise concern for most developers. The spaces in the regex are not optional, which means the users inputting their postcodes must place a space in the postcode. This is an easy fix by simply adding ? after the spaces to render them optional. See the Answer section for a fix.


    Answer

    1. Fixing the UK Government's Regex

    Fixing all the issues outlined in the Problems section and simplifying the pattern yields the following, shorter, more concise pattern. We can also remove most of the groups since we're validating the postcode as a whole (not individual parts):

    See regex in use here

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

    This can further be shortened by removing all of the ranges from one of the cases (upper or lower case) and using a case-insensitive flag. Note: Some languages don't have one, so use the longer one above. Each language implements the case-insensitivity flag differently.

    See regex in use here.

    ^([A-Z][A-HJ-Y]?[0-9][A-Z0-9]? ?[0-9][A-Z]{2}|GIR ?0A{2})$
    

    Shorter again replacing [0-9] with \d (if your regex engine supports it):

    See regex in use here.

    ^([A-Z][A-HJ-Y]?\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$
    

    2. Simplified Patterns

    Without ensuring specific alphabetic characters, the following can be used (keep in mind the simplifications from 1. Fixing the UK Government's Regex have also been applied here):

    See regex in use here.

    ^([A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}|GIR ?0A{2})$
    

    And even further if you don't care about the special case GIR 0AA:

    ^[A-Z]{1,2}\d[A-Z\d]? ?\d[A-Z]{2}$
    

    3. Complicated Patterns

    I would not suggest over-verification of a postcode as new Areas, Districts and Sub-districts may appear at any point in time. What I will suggest potentially doing, is added support for edge-cases. Some special cases exist and are outlined in this Wikipedia article.

    Here are complex regexes that include the subsections of 3.

    In relation to the patterns in 1. Fixing the UK Government's Regex:

    See regex in use here

    ^(([A-Z][A-HJ-Y]?\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$
    

    And in relation to 2. Simplified Patterns:

    See regex in use here

    ^(([A-Z]{1,2}\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$
    

    3.1 British Overseas Territories

    The Wikipedia article currently states (some formats slightly simplified):

    • AI-1111: Anguila
    • ASCN 1ZZ: Ascension Island
    • STHL 1ZZ: Saint Helena
    • TDCU 1ZZ: Tristan da Cunha
    • BBND 1ZZ: British Indian Ocean Territory
    • BIQQ 1ZZ: British Antarctic Territory
    • FIQQ 1ZZ: Falkland Islands
    • GX11 1ZZ: Gibraltar
    • PCRN 1ZZ: Pitcairn Islands
    • SIQQ 1ZZ: South Georgia and the South Sandwich Islands
    • TKCA 1ZZ: Turks and Caicos Islands
    • BFPO 11: Akrotiri and Dhekelia
    • ZZ 11 & GE CX: Bermuda (according to this document)
    • KY1-1111: Cayman Islands (according to this document)
    • VG1111: British Virgin Islands (according to this document)
    • MSR 1111: Montserrat (according to this document)

    An all-encompassing regex to match only the British Overseas Territories might look like this:

    See regex in use here.

    ^((ASCN|STHL|TDCU|BBND|[BFS]IQQ|GX\d{2}|PCRN|TKCA) ?\d[A-Z]{2}|(KY\d|MSR|VG|AI)[ -]?\d{4}|(BFPO|[A-Z]{2}) ?\d{2}|GE ?CX)$
    

    3.2 British Forces Post Office

    Although they've been recently changed it to better align with the British postcode system to BF# (where # represents a number), they're considered optional alternative postcodes. These postcodes follow(ed) the format of BFPO, followed by 1-4 digits:

    See regex in use here

    ^BFPO ?\d{1,4}$
    

    3.3 Santa?

    There's another special case with Santa (as mentioned in other answers): SAN TA1 is a valid postcode. A regex for this is very simply:

    ^SAN ?TA1$
    
  • 29楼
  • 我需要一个可以在SAS中使用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} $
    

    测试用例和注释:

     / *
    笔记
    字母QVX不用于第1位置。
    字母IJZ不用于第二位置。
    当结构以A9A开头时,出现在第三个位置的唯一字母是ABCDEFGHJKPSTUW。
    当结构以AA9A开始时,出现在第四个位置的唯一字母是ABEHMNPRVWXY。
    最后两个字母不使用字母CIKMOV,以便在手写时不会像数字或彼此相似。
    * /
    
    / *
        点点滴滴
        第一名(任何):[A-PR-UWYZ]
        第二位(如果是字母):[A-HK-Y]
        第3位(A1A格式):[A-HJKPSTUW]
        第4位(AA1A格式):[ABEHMNPRV-Y]
        最近2个职位:[ABD-HJLNP-UW-Z]
    * /
    
    
    数据示例;
    infile cards trunco​​ver;
    输入有效1.邮编和10美元。票据和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} $ /”,条带(邮编))?;
    牌;
    1 EC1A 1BB特殊情况1
    1 W1A 0AX特殊情况2
    1 M1 1AE标准格式
    1 B33 8TH标准格式
    1 CR2 6XH标准格式
    1 DN55 1PT标准格式
    0 QN55 1PT第1位不良信
    0 DI55 1PT第二个位置的字母不正确
    0 W1Z 0AX第3位的错字母
    0 EC1Z 1BB第4位不良信
    0 DN55 1CT第二组不良信
    0 A11A 1AA第1组中的数字无效
    0 AA11A 1AA第一组太长
    0 AA11 1AAA第二组太长
    0 AA11 1AAA第二组太长
    0 AAA 1AA第1组中没有数字
    0 AA 1AA第1组无数字
    0 A 1AA第1组中没有数字
    0 1A 1AA第1组缺少信件
    0 1 1AA第1组缺少字母
    0 11 1AA第1组缺少信件
    0 AA1 1A第2组缺少字母
    0 AA1 1第2组缺少字母
    ;
    跑;

相关阅读:

What is the best regular expression to check if a string is a valid URL?

Check whether a string matches a regex in JS

JavaScript file upload size validation

deny direct access to a folder and file by htaccess

Match the path of a URL, minus the filename extension

How to allow only numeric (0-9) in HTML inputbox using jQuery?

How to validate an email address using a regular expression?

How to validate an email address using a regular expression?

XML Schema (XSD) validation tool?

Regular Expression to get a string between two strings in Javascript