Oracle REGEXP_LIKE匹配加拿大邮政编码的约束问题排查
解决Oracle REGEXP_LIKE匹配加拿大邮政编码的约束问题
原正则表达式存在几个关键错误,导致约束校验失败:
- 错误转义了字符类的起始符号
[,写成\[,使得[:upper:]这类Oracle预定义字符类无法正常识别 - 存在语法错误:
(1}是完全无效的正则语法,破坏了整个表达式结构 - 使用
[:punct:]会匹配所有标点符号,但加拿大标准邮编中间只能是连字符-,范围太宽 - 冗余的
{1}量词(单个字符的{1}可以省略,不影响匹配逻辑)
正确的正则表达式及约束写法
针对格式为A1A-2B2的加拿大邮编,正确的校验约束SQL如下:
Postal_Code varchar2(7) CONSTRAINT Table_Postal_Code NULL CONSTRAINT CK_Postal_Code CHECK (REGEXP_LIKE(Postal_Code, '^[[:upper:]]\d[[:upper:]]-[[:digit:]][[:upper:]]\d$'))
正则表达式拆解
^:锁定字符串起始位置,避免匹配字符串开头的无效字符[[:upper:]]:匹配一个大写英文字母(加拿大邮编要求大写)\d:等价于[[:digit:]],匹配一个0-9的数字-:明确匹配连字符,替代原来的[:punct:],精准限定分隔符$:锁定字符串结束位置,避免匹配字符串末尾的无效字符
如果需要兼容无连字符的加拿大邮编格式(如A1A2B2,长度6位),可以调整正则为:
REGEXP_LIKE(Postal_Code, '^[[:upper:]]\d[[:upper:]]-?[[:digit:]][[:upper:]]\d$')
其中-?表示连字符可选,字段用varchar2(7)可以同时兼容带连字符(7位)和无连字符(6位)的格式。
内容的提问来源于stack exchange,提问作者ThrowAway
相关产品推荐
相关产品推荐

