Oracle如何用单个REGEXP_LIKE匹配Dxyx(y+1)x(y+2)格式的nbr值
Oracle正则匹配nbr字段规则解决方案
最终查询语句
SELECT * FROM tbl WHERE formatnbr = 101 AND REGEXP_LIKE(nbr, '^\d(\d)(?:0\11\12|1\12\13|2\13\14|3\14\15|4\15\16|5\16\17|6\17\18|7\18\19)$');
如果你的Oracle版本不支持非捕获组语法,直接删除正则里的?:即可,匹配逻辑完全不变。
规则拆解说明
你描述的Dxyx(y+1)x(y+2)7位nbr规则可以拆解为两个核心要求:
- 第2、4、6位数字完全相同
- 第3、5、7位是连续递增1的数字,仅存在8种合法组合:
012、123、234、345、456、567、678、789
正则表达式解释
^和$限定匹配完整7位字符串,避免部分匹配- 第一个
\d匹配第1位任意数字 (\d)捕获第2位数字为分组1,后续用\1反向引用该值,保证第4、6位和第2位一致- 非捕获组
(?:...)内的8个分支,分别对应第3、5、7位的8种合法连续数字组合,同时嵌入反向引用保证第4、6位符合要求
这个写法兼容所有支持REGEXP_LIKE的Oracle版本,执行效率远高于多个REGEXP_LIKE拼接的写法。
内容的提问来源于stack exchange,提问作者KKR
相关产品推荐
相关产品推荐

