我后regex,将验证一个完整的复杂的英国邮政编码只能在输入串。所有罕见的邮政编码形式必须复盖以及通常的。例如:

比赛

  • CW3并9SS
  • SE5 0EG
  • SE50EG
  • se5 0eg
  • WC2H7LT

没有匹配的

  • aWC2H7LT
  • WC2H7LTa
  • WC2H

我怎么解决这个问题?

有帮助吗?

解决方案

我建议你考虑看看联合王国政府数据的标准用邮政编码[链接,现在死亡; 存档的XML, 见 维基百科 讨论].有一个简要描述有关数据及所附xml模式提供了一个定期表达。这可不正是你想要的,但将是一个良好的起点。RegEx不同于XML略,因为一个P字第三位,在格式A9A9AA是允许的定义给出。

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),他们提供一个更严格的测试,你可以尝试。

其他提示

它看起来像我们将会使用 ^(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})$, ,这是一个略微的修改版本,sugested通过Minglis以上。

然而,我们要调查到底是什么规则,作为各种解决方案上列出现适用不同的规则,规定哪些信件是允许的。

经过一些研究,我们已经找到一些更多的信息。显然是一个页面上的'govtalk.gov。英国'分你一个邮编说明书 govtalk-邮政编码.这一点XML模式在 XML模式 它提供了一个'伪regex声明的邮政编码规则。

我们已经采取的工作和在这一点得到我们的以下表述:

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

这并不涵盖海外领土,并仅仅强制执行格式中,不存在不同的领域。它是根据以下规则:

可以接受以下格式:

  • "GIR0AA"
  • A9 9ZZ
  • A99 9ZZ
  • AB9 9ZZ
  • AB99 9ZZ
  • A9C9ZZ
  • AD9E9ZZ

其中:

  • 9可以是任何单位数字。
  • 一个可以任何字母除了问,V或X.
  • B可以是任何封信除了我,J或Z。
  • C可以是任何封信除了我,L,M、N、O、P、Q,R,V,X、Y或Z。
  • D可以是任何封信除了我,J或Z。
  • E可以是任何一个、B、E、H、M、N、P,R,V,W,X或Y。
  • Z可任何信,除了C、I、K、M、O或诉

最良好的祝愿

科林

没有这样的东西作为一个全面的英国邮政编码经常表达的就是能够 验证 一个邮政编码。你可以检查这一邮政编码是正确格式的使用普通的表达;不,它确实存在。

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

你不能指望有什么目前是真实的,直到永远。作为一个例子,在1990年后办公室的决定,阿伯丁是有点拥挤。他们加入一个0至结束AB1-5,使它AB10-50然后创建了一个数量的邮政编码之间在这些。

每当一个新的街道是建立一个新的邮政编码是创建。这是进程的一部分用于获得许可建造;地方当局有义务保持这个更新后的办公室(不是他们所做)。

此外,正如一些其他的用户,有特别的邮政编码如Girobank,GIR0AA,一个为信给圣诞老人,圣TA1-你可能不想以后什么都有,但它不会出现涉及的任何其他的答案。

然后,还有BFPO邮政编码,这是现在 改变一个标准格式.这两种格式将是有效的。最后,还有的海外领土 源Wikipedia.

+----------+----------------------------------------------+
| Postcode |                   Location                   |
+----------+----------------------------------------------+
| AI-2640  | Anguilla                                     |
| 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 1AA | Gibraltar                                    |
| PCRN 1ZZ | Pitcairn Islands                             |
| SIQQ 1ZZ | South Georgia and the South Sandwich Islands |
| TKCA 1ZZ | Turks and Caicos Islands                     |
+----------+----------------------------------------------+

接下来,你必须考虑到,英国的"出口"其邮政编码系统来在世界上的很多地方.任何验证"英国"的邮政编码还将验证的邮政编码的一些其他国家。

如果你想要 验证 一个英国的邮政编码最安全的方式来做到它是用一个查当前的邮政编码。有一定数量的选项:

  • 弹药的调查版本 代码点打开 在一个开放的数据的许可证。这将是非常稍微落后于时代,但它是免费的。这将(可能-我不记得)不包括北爱尔兰数据作为弹药的调查已没有职权范围。映在北爱尔兰进行的弹药的调查北爱尔兰,他们有自己的、独立的、支付, 指针 产品。你可以用这个和追加的几个不会涉及相当容易。

  • 皇家邮件释放 邮政地址文件(减贫基金), 这包括BFPO它我不确定代码点开放。它定期更新,但成本钱(他们可以是彻头彻尾的意思是有时候).PAF包含完整的地址,而不是刚刚邮政编码,并配有自己的 程序指南.开放数据用户小组(ODUG)目前正在游说有PAF发布免费的, 这里有一个说明他们的位置.

  • 最后,还有 AddressBase.这是一个协作之间的弹药的调查、地方当局、皇家邮件和配套的公司来创建一个明确的目录有关的所有信息英国所有的地址(他们已经相当成功)。这是付费的,但是如果你的工作与地方当局、政府部门或政府服务是免费为他们使用。有很多更多的信息不仅仅是邮政编码包括在内。

我最近发布 一个答案这个问题在英国的邮政编码R语言.我发现, 英国政府的regex模式是不正确 和失败 正确 验证一些邮政编码。不幸的是,许多问题的答案在这里,是基于这种不正确的模式。

我将概述这些问题,下文并提供一个经修订的规则的表达, 实际上 工程。


注意到

我的回答 (并经常表达的一般):

  • 仅仅证明的邮政编码 格式.
  • 并不确保一个邮政编码 合法存在.
    • 为此,使用适当的API!看看 Ben的答案 更多的信息。

如果你不关心 坏regex 只是想跳到答案,滚下来的 答案 部分。

坏Regex

经常表达这一部分不应采用。

这是失败的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})|(([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})$

的问题

问题1-复制、粘贴

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

第一件事情最开发者会做的只是清除行没有思想的两倍。现在regex不匹配的邮政编码与空间在他们(其他比 GIR 0AA 邮政编码).

要解决这个问题,newline字应当替换空间的角色:

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

问题2-边界

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

邮政编码regex不当锚regex.任何人使用这regex到验证的邮政编码可能会惊讶如果一个值喜欢 fooA11 1AA 获得通过。那是因为他们已经抛锚开始的第一选择和第二选项(独立),以指出在regex以上。

这意味着 ^ (称的位置在开始的线)仅适用于第一个选项 ([Gg][Ii][Rr] 0[Aa]{2}), ,因此第二种选择将确认任意字符串 结束 在邮政编码(无论什么来之前)。

同样,第一个选项并不是固定线的末端 $, ,所以 GIR 0AAfoo 也是可以接受的。

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

要解决这个问题,这两种选择应该包裹在另一个组(或非捕获团)和锚放在周围是:

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

问题3-不适当的角色设定

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

Regex是缺少一个 - 在这里以表示一个字符的范围。因为它的立场,如果一个邮编的格式 ANA NAA (在那里 A 代表一个字母, N 表示数),并开始与任何其他的不是 AZ, 它将失败。

这意味着它会比赛 A1A 1AAZ1A 1AA, 但不 B1A 1AA.

要解决这个问题,符 - 应当被置之间 AZ 在各自的角色设定:

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

问题4-是错误的可选择的角色设定

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

我发誓他们甚至没有试验这件事情之前公布在网页。他们做了错误的字符组可选择的。他们做了 [0-9] 选择在第四子选择的备选办法2(小组9所示)。这使regex到匹配的正确格式的邮政编码喜欢 AAA 1AA.

要解决这个问题,使下一个符类可选,而不是(和随后使设置 [0-9] 完全匹配,一旦):

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

问题5-性能

性能在这regex是极其贫穷。首先,他们最有可能的模式相匹配的选择 GIR 0AA 在开始。有多少用户可能会有这样的邮政编码与任何其他邮政编码;可能永远不会?这意味着每次regex用,它必须废这个选择之前,先进行下一个选项。看到的性能产生怎样的影响检查的数量的步骤, 原regex 把(35)对的 同regex后翻转的选择 (22).

第二个问题与业绩是由于整个regex结构。有没有点回溯过的每一个选项,如果一个失败。该方式的目前regex结构可以大大简化。我提供一个解决这个的 答案 部分。

问题6-空格

见regex在这里使用

这可能不是认为 的问题, 本身,但它确实提出关切,对于大多数开发。空间在regex不是可选择的,这意味着用户输入其邮政编码必须将一空间的邮政编码。这是一个简单的解决方法只需增加 ? 之后的空间,以使他们可选择的。看看 答案 部分用于修复。


答案

1.固定英国政府的Regex

修复所有的问题概述 的问题 部分和简化模式产生以下,更短、更简洁的图形。我们还可以删除大多数的群体由于我们正在验证的邮政编码作为一个整体(不是单个的部分):

见regex在这里使用

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

这可以进一步缩短,消除所有的范围从一个情况下(上或下情况)和使用情况不敏感的标志。 注意到:一些语言没有一个,所以使用的时间越长之一以上。每一种语言实现的情况-不敏感的标志不同。

见regex在这里使用.

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

更短的再次更换 [0-9]\d (如果你的regex引擎的支持的话):

见regex在这里使用.

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

2.简化模式

没有确保具体的字母字符,以下可以使用(请注意简化从 1.固定英国政府的Regex 也已经应用在这里):

见regex在这里使用.

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

甚至进一步的如果你不关心的特殊情况 GIR 0AA:

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

3.复杂的模式

我不会建议的过核查的邮政编码作为新的领域,地区和次地区可能出现在任何时间点。什么我将建议 潜在的 这样做,是增加了支持边缘的情况。某些特殊情况下存在,并概述 这个维基百科的文章.

这里是复杂的regex,包括小节 3. (3.1, 3.2, 3.3).

关于模式 1.固定英国政府的Regex:

见regex在这里使用

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

和在有关 2.简化模式:

见regex在这里使用

^(([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的英国海外领土

维基百科的文章目前的国家(有些格式略作简化):

  • AI-1111:Anguila
  • ASCN 1ZZ:阿森松岛
  • STHL 1ZZ:圣赫勒拿的
  • TDCU 1ZZ:特里斯坦-达库尼亚群岛
  • BBND 1ZZ:英属印度洋领土
  • BIQQ 1ZZ:英属南极领地
  • FIQQ 1ZZ:福克兰群岛
  • GX11 1ZZ:直布罗陀
  • PCRN 1ZZ:皮特凯恩群岛
  • SIQQ 1ZZ:南乔治亚岛和南桑威奇群岛
  • TKCA 1ZZ:特克斯和凯科斯群岛
  • BFPO 11:阿克罗蒂里和德凯利亚
  • ZZ 11 & GE CX:百慕大(据 这份文件)
  • KY1-1111:开曼群岛(根据 这份文件)
  • VG1111:英属维尔京群岛(根据 这份文件)
  • MSR 1111:蒙特塞拉特(根据 这份文件)

一个无所不包的regex要的比赛只有英国海外领土可能是这样的:

见regex在这里使用.

^((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英国部队员额的办公室

虽然他们已经被最近改变了它,以便更好地协调与英国的邮政编码系统 BF# (在那里 # 表示数),他们认为 可选择的替代邮政编码.这些邮政编码按照(ed)的格式 BFPO, ,随后1至4位数:

见regex在这里使用

^BFPO ?\d{1,4}$

3.3圣诞老人吗?

还有另一种特殊的情况下圣诞老人(如中提到的其他答复): SAN TA1 是一个有效的邮政编码。Regex为这是非常简单:

^SAN ?TA1$

我已经看到的一些答复上述,我建议使用的模式,从@丹的 回答(c。Dec15'10), ,由于不正确标志的近0.4%的有效的邮政编码为无效,而其他人不这样做。

弹药的调查提供的服务,称为代码点开放,其中:

含有一个列表中的所有当前的邮政编码单位在大不列颠

我跑了每个regexs上述反对的完全清单的邮政编码(七月6'13)从此数据的使用 grep:

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)$

经常表达以配合有效的英国 邮政编码。在英国邮政系统不 所有的字母都用在所有的位置 (同样车辆登记 车牌)并有各种不同的规则 管辖这一点。这regex考虑到 帐户的那些规则。详细信息 规则:第一半的有效的邮政编码 格式[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不用除了在吉尔0AA 位置。约束 AEHMNPRTVXY仅使用的位置 等等。性限制-第二ABEHMNPRVWXY 一半的邮政编码有效的格式 [0-9][A-Z][A-Z]的例外情况位置 第二和第三位。受约束-CIKMOV 不用

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

大部分答案在这里没有工作的所有邮政编码我在我的数据库。我终于找到一个验证与所有,使用新的regex政府提供的:

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

更新:更正则为指由杰米*牛。不知道如果是我错误的复印或者它是一个错误政府regex,该链接是现在向下...

更新:作为ctwheels发现,这regex工作与javascript regex的味道。看到他的评论针对一个工程与pcre(php)的味道。

根据这个维基百科的表

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

当使用它在安卓\Java使用\\d

一个古老的职位,但仍很高,在谷歌的结果,所以以为我会更新。这月14doc定义的英国邮政编码经常表达为:

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

自:

https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/359448/4__Bulk_Data_Transfer_-_additional_validation_valid.pdf

该文件还解释了背后的逻辑。然而,它有一个错误(粗体)和也允许的情况下,虽然法律不是往常一样,修订后的版本:

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

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

这是regex谷歌提供关于他们的 i18napis.appspot.com 域:

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}

邮政编码都受到改变,唯一真正的方式验证的邮政编码是要有完整的邮政编码,看看它是否存在。

但经常的表现是有用的,因为它们:

  • 是易于使用和实施
  • 是短暂的
  • 是快速运行
  • 是很容易保持(相比一个完整的列表的邮政编码)
  • 仍然赶上大多数输入错误。

但是,经常表达的往往是难以维持,尤其是对于个人没出了它在第一位。因此,它必须是:

  • 为容易理解为可能的
  • 相对未来的证据

这意味着最普通的表达在这个答案不够好。E.g。我可以看到, [A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y] 是匹配的一个邮政地区的形式AA1A—但这会是一个痛苦的脖子如果并且当新的邮政编码的区域被添加,因为很难了解哪些地区,它的邮政编码相匹配。

我也想要我的正常的表达,以配合第一和第二次半的邮政编码作为圆括号括相匹配。

所以我已经拿出这样的:

(GIR(?=\s*0AA)|(?:[BEGLMNSW]|[A-Z]{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
      [A-Z]{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

对我来说这是正确的平衡之间的验证尽可能多,同时向未来以及允许容易的维护。

我一直在寻找一个英国邮政编码regex的最后一天,或因和偶然发现这个线程。我的工作我的方式通过的大多数建议上,并没有人为我工作所以我来到了我自己的regex其中,因为我所知,捕获所有有效的英国邮政编码为的Jan'13(根据最新的文献来自皇家邮件)。

Regex和一些简单的邮政编码查PHP代码贴如下。注意:它允许对低于或大写的邮政编码和GIR0AA异常,但要处理,更有可能的,存在的一个空间的中间输入的邮政编码这还使用一个简单的译去除空间测试之前对regex.任何差异之外,皇家邮件自己甚至没有提到他们在他们的文献(见 http://www.royalmail.com/sites/default/files/docs/pdf/programmers_guide_edition_7_v5.pdf 并开始阅读,从第17页)!

注: 在皇家邮件自己的文献(上面的链接),有的是轻微的模糊周围的第3和第4职位和例外情况的地方,如果这些字符字母。我联系了皇家邮件直接为清楚起来,并在他们自己的话说"一封信,信中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][a-z]{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>";

    }

?>

我希望这可以帮助的任何其他人来过这个线程在寻找一个解决方案。

这里有一个regex根据规定的格式的文件,是联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}$/

一些regexs上是一个小小的限制性的。注意真正的邮政编码:"W1K7AA"将失败,给出的规则"的位置3-AEHMNPRTVXY仅使用"上面"K"将是不允许的。

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

似乎有点更加准确,看到 维基百科文章,题为'邮政编码在联合王国'.

注意,这regex需要大写字母只字。

更大的问题是你是否限制用户输入的到仅允许邮政编码实际存在或者你是否只是试图阻止用户进入完整的垃圾进入形式领域。正确的匹配的每一个可能的邮政编码,今后校对它,是一个困难的难题,并且可能是不值得的,除非你是英国.

基本规则:

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

邮政编码在英国(或邮政编码,因为他们是所谓的)是由五至七个字母数字分开的空间。规则复盖了其中人物可以出现在特殊的位置是相当复杂和充满了例外情况。经常表达的只是示所坚持的基本规则。

完整的规则:

如果你需要一个regex蜱所有的箱子的邮政编码规则的费用可读性,在这里,你去:

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

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

我用以下regex,我已经测试了针对所有有效的英国邮政编码。它是根据该建议规则,但凝聚尽量合理和不使用任何特殊的语言的具体regex规则。

([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"邮政编码被排除在外,并不会验证,因为它不在官方邮局列出的邮政编码和尽我知道不会被用来作为注册地址。增加它应该是微不足道的作为一个特殊的情况下,如果需要的话。

第一半的邮政编码有效的格式

  • [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]

例外情况
位置1-QVX不用
位2-IJZ不用除了在吉尔0AA
位3-AEHMNPRTVXY仅用
位置4-ABEHMNPRVWXY

第二一半的邮政编码

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

例外情况
位置2+3-CIKMOV不用

记住不是所有可能的代码被用,所以这个名单是必要的,但不是足够的条件的有效代码。它可能更易于只是比赛对一个列表中的所有有效的代码?

这里就是我们如何一直在处理与英国的邮政编码问题:

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

说明:

  • 预期有1或2个a-z字符,上或下的现
  • 预期有1或2个数字
  • 预期0或1-z char,上或下的现
  • 可选择的空间允许的
  • 预期1号
  • 预计2a-z,高或较低的收

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

希望这可以帮助

检查邮政编码是一个有效的格式,因为每皇家邮件的 程序指南:

          |----------------------------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][A-Z]?|[1-9][0-9])|[1-9]([0-9]|[A-HJKPSTUW])?) [0-9][ABD-HJLNP-UW-Z]{2})$

所有的邮政编码上 doogal.co.英国 匹配,除了对于那些不再使用。

增加一个 ? 后空间和使用情况不敏感的匹配,以回答这个问题:

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

这一允许空的空间和标签从两侧的情况下,你不想失败验证,然后剪断绝一侧。

^\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*$)

我想要一个简单的regex,它的罚款,以允许过多,但不是拒绝一个有效的邮政编码。我去了这个(输入是剥离/修剪string):

/^([a-z0-9]\s*){5,7}$/i

长5到7(不计算的空白)意味着我们允许尽可能短的邮政编码,如"L1 8JQ"以及最长的像"OL14 5ET".

编辑:改变了8至7所以我们不允许的8个字符的邮政编码。

添加到这个清单更加实际regex,我使用,使用户可以输入一个 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}))$

这regex允许资本和较低的情况下,字母有一个可选的空间之间

从一个软件开发人员的角度看,这regex是有用的软件里的一个地址可以是任选的。例如,如果用户没有想到提供其详细地址

看看python码在这个页面:

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

我已经有了一些邮政编码分析做。要求很简单;我得分析一个邮编入一个outcode和(可选)incode.这个好消息是我没有执行任何验证-我要砍了什么我已经提供了一个模糊的智能的方式。我不能承担很多关于我的进口方面的格式,即情况和嵌入式的空间。但是,这并不是坏消息;坏消息是,我必须这样做所有角色扮演。:-(

尽管如此,我扔了一个小Python功能结合在一起,以澄清我的思维。

我已经用它来处理邮政编码给我。

我们得到一个规格:

UK postcodes must be in one of the following forms (with one exception, see below): 
    § A9 9AA 
    § A99 9AA
    § AA9 9AA
    § AA99 9AA
    § A9A 9AA
    § AA9A 9AA
where A represents an alphabetic character and 9 represents a numeric character.
Additional rules apply to alphabetic characters, as follows:
    § The character in position 1 may not be Q, V or X
    § The character in position 2 may not be I, J or Z
    § The character in position 3 may not be I, L, M, N, O, P, Q, R, V, X, Y or Z
    § The character in position 4 may not be C, D, F, G, I, J, K, L, O, Q, S, T, U or Z
    § The characters in the rightmost two positions may not be C, I, K, M, O or V
The one exception that does not follow these general rules is the postcode "GIR 0AA", which is a special valid postcode.

我们来到了这一点:

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

但请注意-这将允许任意数量的空间之间的群体。

我regex为英国的邮政编码验证。

这是工作的所有类型的邮政编码无论是内部或外

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

这是工作的所有类型的格式。

例如:

AB10-------------------->只有外邮政编码

A1 1AA------------------>组合(内外)邮政编码

WC2A-------------------->外

所接受的回答反映了规则赋予的皇家邮件,虽然有一个错误regex.这种打字错误似乎已在那里的gov。英国的网站(因为它是在XML归档页)。

在格式A9A9AA的规则允许一个P字第三位置,同时regex不允许这一点。正确的regex将是:

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

缩短这种结果在以下regex(其使用Perl/红宝石的语法):

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

它也包括可选择的空间第一和第二块。

我有什么发现在几乎所有的变化和regex从大量传送pdf格式和什么是维基百科上的网站,专门为维基百科regex是,需要有一个^后的第一|(竖条)。我想这个了通过测试对AA9A9AA,因为否则的格式检查A9A9AA将会进行验证。例如检查EC1D1BB这应该是无效的回来有效,因为C1D1BB是一个有效的格式。

这里是我已经想出了一个良好的regex:

^([G][I][R] 0[A]{2})|^((([A-Z-[QVX]][0-9]{1,2})|([A-Z-[QVX]][A-HK-Y][0-9]{1,2})|([A-Z-[QVX]][0-9][ABCDEFGHJKPSTUW])|([A-Z-[QVX]][A-HK-Y][0-9][ABEHMNPRVWXY])) [0-9][A-Z-[CIKMOV]]{2})$

我需要一个版本,将工作在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}$

测试情况,并注意到:

/* 
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;

下面的方法将检查邮政编码,并提供完整的信息

const valid_postcode = postcode => {
    try {
        postcode = postcode.replace(/\s/g, "");
        const fromat = postcode
            .toUpperCase()
            .match(/^([A-Z]{1,2}\d{1,2}[A-Z]?)\s*(\d[A-Z]{2})$/);
        const finalValue = `${fromat[1]} ${fromat[2]}`;
        const 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})|(([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;
        return {
            isValid: regex.test(postcode),
            formatedPostCode: finalValue,
            error: false,
            info: 'It is a valid postcode'
        };
    } catch (error) {
        return { error: true , info: 'Invalid post code has been entered!'};
    }
};
valid_postcode('GU348RR')
result => {isValid: true, formatedPostCode: "GU34 8RR", error: false, info: "It is a valid postcode"}
valid_postcode('sdasd4746asd')
result => {error: true, info: "Invalid post code has been entered!"}
valid_postcode('787898523')
result => {error: true, info: "Invalid post code has been entered!"}

我偷了这个从XML文件,它似乎复盖所有情况下没有硬转账编码:

%r{[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}}i

(红宝石的语法与忽视情况)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top