英国邮政编码正则表达

时间:2013-06-09 18:08:21

标签: c# regex postal-code

我希望能够验证英国邮政编码,理想情况下,我希望通过以下案例:

  1. W1
  2. W12
  3. WC1
  4. WC1A
  5. WC12
  6. W1 6BT
  7. W12 6BT
  8. WC1 6BT
  9. WC1A 6BT
  10. WC12 6BT
  11. W16BT
  12. W126BT
  13. WC16BT
  14. WC1A6BT
  15. WC126BT
  16. 我有以下正则表达式模式:

    ^(GIR 0AA)|(((A[BL]|B[ABDHLNRSTX]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]?|F[KY]|G[LUY]?|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EKL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTY]?|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)[1-9]?[0-9]|((E|N|NW|SE|SW|W)1|EC[1-4]|WC[12])[A-HJKMNPR-Y]|(SW|W)([2-9]|[1-9][0-9])|EC[1-9][0-9])( [0-9][ABD-HJLNP-UW-Z]{2})?)$
    

    这种模式允许3或4& 6或7位数的邮政编码(所以外部代码只有3或4位数字,或者是6或7位数的完整邮政编码)但它不允许使用第4和第6点(省略空格的邮政编码)

    我也有这种模式:

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

    此模式允许6或7位数的邮政编码,我们没有空格,但不包含不完整的邮政编码(仅限外向代码)

    很抱歉,我已经在这里提出了一个已经广泛讨论过的问题,但是我发现的所有例子都符合我的部分要求,但不是全部。

    理想情况下,我想要一个允许3,4,6和6的正则表达式模式。 7位数的邮政编码,我们没有空格。

    更新

    我已经完成了我的通过案件,因为我认为它最初并不完全全面。其基本概念应遵循英国邮政编码模式,并验证以下任何组合:

    1 Letter 1 Number
    1 Letter 2 Numbers
    2 Letters 1 Number
    2 Letters 1 Number 1 Letter
    2 Letters 2 Numbers
    1 Letter 1 Number (OptionalSpace) 1 Number 2 Letters
    1 Letter 2 Numbers (OptionalSpace) 1 Number 2 Letters
    2 Letters 1 Number (OptionalSpace) 1 Number 2 Letters
    2 Letters 1 Number 1 Letter (OptionalSpace) 1 Number 2 Letters
    2 Letters 2 Numbers (OptionalSpace) 1 Number 2 Letters
    

    ^希望以上是有道理的,并且足够详细。我知道有点难以阅读。

    解答:

    所以我现在有一个正则表达式,它传递了上面的所有情况(例子和模式)。正如下面的评论中提到的那样,即使不是不可能满足所有英国邮政编码也是非常困难的,但是,下面的那个就是我需要的,并且对于90%的输入案例应该是好的:

    ^(GIR 0AA)|[a-z-[qvx]](?:\d|\d{2}|[a-z-[qvx]]\d|[a-z-[qvx]]\d[a-z-[qvx]]|[a-z-[qvx]]\d{2})(?:\s?\d[a-z-[qvx]]{2})?$
    

1 个答案:

答案 0 :(得分:6)

您是否注意到相关问题UK Postcode Regex (Comprehensive)

英国政府提供的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-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})

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