如何编写SELECT正则表达式实现底盘序列号合规校验
底盘序列号校验正则解决方案
校验规则澄清
根据你提供的用例,实际校验规则如下(原需求描述存在笔误):
- 仅允许包含大小写英文字母、阿拉伯数字,不允许其他字符(如横杠、下划线等)
- 相同字符仅允许连续出现,不允许间隔其他字符后重复出现
原有正则的问题
- 你编写的正则
^(?!.*?([\w])\1).+作用是禁止任何连续重复的字符,和实际要求的规则完全相反,这是返回结果不符合预期的核心原因 - 其次
\w在Oracle正则中包含下划线_,不符合仅允许字母和数字的要求
正确实现方案
正则表达式
^(?!.*(.)(?!\1).*\1)[A-Za-z0-9]+$
规则说明
^[A-Za-z0-9]+$限制整个字符串仅由字母和数字组成,拦截含特殊字符的序列号(?!.*(.)(?!\1).*\1)是负向预查,禁止出现「某个字符后面跟着不同字符、之后又出现相同字符」的情况,保证相同字符只能连续排列
测试SQL
-- 校验通过的用例返回值大于0,校验不通过返回0 -- 合法用例测试 SELECT REGEXP_INSTR('1234567890', '^(?!.*(.)(?!\1).*\1)[A-Za-z0-9]+$') FROM dual; -- 返回1 SELECT REGEXP_INSTR('aaaaaaaaaa', '^(?!.*(.)(?!\1).*\1)[A-Za-z0-9]+$') FROM dual; -- 返回1 SELECT REGEXP_INSTR('aaabbbcccd', '^(?!.*(.)(?!\1).*\1)[A-Za-z0-9]+$') FROM dual; -- 返回1 SELECT REGEXP_INSTR('1088', '^(?!.*(.)(?!\1).*\1)[A-Za-z0-9]+$') FROM dual; -- 返回1,符合预期 -- 非法用例测试 SELECT REGEXP_INSTR('13er4t691d', '^(?!.*(.)(?!\1).*\1)[A-Za-z0-9]+$') FROM dual; -- 返回0 SELECT REGEXP_INSTR('vc-376t65e', '^(?!.*(.)(?!\1).*\1)[A-Za-z0-9]+$') FROM dual; -- 返回0
内容的提问来源于stack exchange,提问作者reymagnus
相关产品推荐
相关产品推荐

