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个地址,并告诉投递办公室将投递邮件的邮政路线(或步行)

消化这一点

  • 一个或两个字母
  • 一个数字,也许还有一个字母数字
  • 空间
  • “通常”是一个数字,但我找不到其他任何例子
  • 2封信
  • 我们不能使用
    \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