Sql 在oracle中使用正则表达式验证英国邮政编码
以下是有效邮政编码列表:Sql 在oracle中使用正则表达式验证英国邮政编码,sql,regex,oracle,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)$,但它不起作用。请您帮助我进行正确的查询,以验证所有邮政编码格式。首先,不要根据手头的数据进行猜测 EC1V 9HQ 前一两个字母是邮政编码区,它标识了处理邮件的主要皇家邮政分拣办公室。在这种情况下,EC将前往伦敦的Mount Pleas
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)$
,但它不起作用。请您帮助我进行正确的查询,以验证所有邮政编码格式。首先,不要根据手头的数据进行猜测
EC1V 9HQ
前一两个字母是邮政编码区,它标识了处理邮件的主要皇家邮政分拣办公室。在这种情况下,EC将前往伦敦的Mount Pleasant分拣办公室
第二部分通常只是一个或两个数字,但对于伦敦的某些地区,它可以是一个数字和一个字母。这是邮政编码区,告诉分拣办公室邮件应该去哪个投递办公室
这第三部分是部门,通常只是一个数字。这会告诉投递办公室邮件应该寄往哪个地区或社区
邮政编码的最后一部分是单位代码,单位代码总是两个字母。这可以识别一组多达80个地址,并告诉投递办公室将投递邮件的邮政路线(或步行)
消化这一点
\w
,因为它包含下划线
我在^
和$
上使用了更精确的\A
和\z
,因为\A和\z
匹配字符串的精确开头和结尾,而^
和$
匹配行的开头和结尾<代码>$
尤其允许尾随换行符
当然,也有特殊情况。XXXX 1ZZ对于各种海外领土,XXXX被列举
\A(ASCN|STHL|TDCU|BBND|BIQQ|FIQQ|PCRN|SIQQ|TKCA) 1ZZ\z
然后是一些非常特殊的情况
- 女孩0AA
- 安圭拉的AI-2640
(…|…|…)
混乱中。最好将查询分为三部分构建,并将其与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
不利的一面是,这将允许输入不存在的邮政编码。从好的方面来说,你不必为额外的特殊情况不断调整。对于这种级别的过滤,这可能没问题。无论是
BFPO 1
还是BFPO 11
都不是有效的英国邮政编码。向内部分正好是三个字符。BFPO 111
也无效,向内部分总是以两个字母结尾。不需要转义空格。然后,您正在搜索一个或两个字母后跟一个或两个数字-这根本不是正确的模式(即使您的示例中有A1A 1AA-也不是以数字结尾)。您只是想验证格式(如您在问题的最后所说),还是验证邮政编码本身?并非所有遵循所有格式规则的字符串实际上都是有效的邮政编码。如果您对邮政编码本身感兴趣,最好有一个实际编码表,并与此表进行比较。否则,许多“假”代码将被验证,只是因为它们遵循正确的格式。对于家庭作业,正则表达式验证是可以的,但在商业应用中,最好根据保存所有有效邮政编码的数据库进行验证。完整的列表可用[CSV,64,2MB],或者可以简单地从openstreetmap生成。根据,不支持\z
(但是\z
意味着\z
应该意味着什么,并且\A
很奇怪)。根据,支持[:
:]
。在一个例子中使用了[[:alpha:][]
(但它也声称[s|r | p]
是如何匹配s
或r
或p
,所以我不知道它有多可信)。谷歌搜索文档肯定会比编写此回复花费更少的时间@mathguy噢,哇,那页列出了\A
,\Z
,\Z
,它们的通常含义(与我发现的不同)都得到了支持,但它错误地记录了$
。Oracle应该有人校对他们的regexp文档。@Melpomene-Oracle有很多“文档错误”,似乎它的从业者(我不是其中之一)都非常清楚这一点。例如,在较新版本中已更正
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'
)
\A([[:alnum:]]{2,4} \d[[:alpha:]]{2}|AI-2640)\z