繁体   English   中英

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

[英]Validate UK postcode using regular expression in oracle

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

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

我试过(([AZ]{1,2}[0-9]{1,2})\\ ([0-9][AZ]{2}))|(GIR\\ 0AA)$但它不是在职的。 您能否帮助我进行正确的查询以验证所有邮政编码格式。

首先,与其根据手头的数据集进行猜测,不如让我们看看英国的邮政编码是什么

EC1V 9HQ

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

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

这第三部分是扇区,通常只是一个数字。 这会告诉投递办公室邮件应该去往哪个地区或社区。

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

消化那个...

  1. 1 或 2 个字母。
  2. 一个数字,也许是一个字母数字。
  3. 空间。
  4. “通常”是一个数字,但除此之外我找不到任何实例。
  5. 2个字母。
\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

然后是一些非常特殊的情况。

  • GIR 0AA 为Girobank
  • 用于安圭拉的 AI-2640。
\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

不利的一面是,这会让不存在的邮政编码进入。 从好的方面来说,您不必为其他特殊情况不断调整。 对于这种级别的过滤,这可能没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM