使用oracle中的正则表达式验证英国邮政编码

时间:2017-02-05 00:00:55

标签: sql regex oracle

以下是有效邮政编码列表:

A1 1AA
A11 1AA
AA1 1AA
AA11 1AA
A1A 1AA
BFPO 1
BFPO 11
BFPO 111

我尝试使用(([A-Z]{1,2}[0-9]{1,2})\ ([0-9][A-Z]{2}))|(GIR\ 0AA)$,但它无效。你可以帮我正确查询以验证所有的邮政编码格式。

1 个答案:

答案 0 :(得分:2)

首先,而不是根据手头的数据集进行猜测,let's look at what UK postcodes are

  

EC1V 9HQ

     

前一个或两个字母是邮政编码区域,它标识将处理邮件的主要皇家邮件分拣办公室。在这种情况下,EC将前往伦敦的Mount Pleasant分拣办公室。

     

第二部分通常只有一两个数字,但对于伦敦的某些地方,它可以是数字和字母。这是邮政编码区,告诉分拣办公室邮件应该到哪个递送办公室。

     

这第三部分是扇区,通常只是一个数字。这告诉送货局邮件应该去哪个地区或街区。

     

邮政编码的最后一部分是单位代码,总是两个字母。这标识了一组最多80个地址,并告诉交付办公室哪个邮政路线(或步行)将交付物品。

消化......

  1. 1或2个字母。
  2. 一个数字,也许是一个字母数字。
  3. 空间。
  4. "通常"一个数字,但我无法找到任何实例。
  5. 2个字母。
  6. \A[[:alpha:]]{1,2}\d[[:alnum:]]? \d[[:alpha:]]{2}\z
    

    我们无法使用\w,因为它包含下划线。

    我使用\A\z^$的更准确,因为\A\z与确切的开头和结尾相匹配字符串,而^$匹配行的开头和结尾。 $特别容忍尾随换行符。

    当然,有特殊情况。 XXXX 1ZZ适用于各种海外地区,XXXX列举。

    \A(ASCN|STHL|TDCU|BBND|BIQQ|FIQQ|PCRN|SIQQ|TKCA) 1ZZ\z
    

    然后是几个非常特殊的案例。

    • Girobank的GIR 0AA。
    • AI-2640 for Anguilla。
    \A(AI-2640|GIR 0AA)\z
    

    将它们全部放在一个大的(...|...|...)混乱中。将查询分为三部分并将其与x修饰符放在一起以忽略空格是一件好事。

    REGEXP_LIKE(
        postcode,
        '\A
         (
          [[:alpha:]]{1,2}\d[[:alnum:]]?\ \d[[:alpha:]]{2}\z   |
          (ASCN|STHL|TDCU|BBND|BIQQ|FIQQ|PCRN|SIQQ|TKCA)\ 1ZZ  |
          (AI-2640|GIR\ 0AA)
         )
         \z',
        'x'
    )
    

    或者你可以使基本的正则表达式不那么严格,并且第一部分接受2-4个字母数字。然后只有安圭拉担心的特殊情况。

    \A([[:alnum:]]{2,4} \d[[:alpha:]]{2}|AI-2640)\z
    

    在缺点方面,这将允许不存在的邮政编码。从好的方面来说,你不必继续调整其他特殊情况。对于这种级别的过滤,这可能很好。