以下是有效邮政编码列表:
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)$
,但它无效。你可以帮我正确查询以验证所有的邮政编码格式。
答案 0 :(得分:2)
首先,而不是根据手头的数据集进行猜测,let's look at what UK postcodes are。
EC1V 9HQ
前一个或两个字母是邮政编码区域,它标识将处理邮件的主要皇家邮件分拣办公室。在这种情况下,EC将前往伦敦的Mount Pleasant分拣办公室。
第二部分通常只有一两个数字,但对于伦敦的某些地方,它可以是数字和字母。这是邮政编码区,告诉分拣办公室邮件应该到哪个递送办公室。
这第三部分是扇区,通常只是一个数字。这告诉送货局邮件应该去哪个地区或街区。
邮政编码的最后一部分是单位代码,总是两个字母。这标识了一组最多80个地址,并告诉交付办公室哪个邮政路线(或步行)将交付物品。
消化......
\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
然后是几个非常特殊的案例。
\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
在缺点方面,这将允许不存在的邮政编码。从好的方面来说,你不必继续调整其他特殊情况。对于这种级别的过滤,这可能很好。