如何编写正则校验含最多2个连字符的字段 拦截全重复数字
正则校验规则调整方案
需求梳理
待校验字段需同时满足以下规则:
- 以1个英文字母开头
- 首字母后共包含15位字母/数字有效字符,字符间最多可插入2个连字符(
-),连字符不可出现在字符串首尾 - 非法场景:去除所有连字符后,首字母后的15位有效字符完全重复(例如
N000000000000000、N000000-0000-00000这类后序全为0的值需拦截)
原有正则缺陷
原有正则代码:
^(?!^(.)\\1*$)([A-Z]{1}(?=[A-Z0-9-]{2,15}$)[A-Z0-9]*(?:\\-[A-Z0-9]*){0,2}[A-Z0-9]+$)
核心问题是负向预查逻辑(?!^(.)\\1*$)仅判断原始完整字符串是否为全重复字符,没有跳过连字符做判断,也没有针对首字母后的有效字符段做重复校验,因此无法拦截带连字符的后序全重复值。
调整后可用正则
^[A-Z](?!(?:-*([A-Z0-9])(?:-*\1)){15}$)(?=[A-Z0-9-]{15,17}$)[A-Z0-9]*(?:-[A-Z0-9]*){0,2}$
逻辑说明
- 开头
^[A-Z]强制要求首字符为大写英文字母,如需支持小写可增加大小写不敏感修饰符i - 新增的负向预查
(?!(?:-*([A-Z0-9])(?:-*\1)){15}$)会自动跳过连字符,校验首字母后的15个有效字符是否完全一致,只要后序全为同一个字符(无论中间插了几个、插在什么位置的连字符)都会被拦截 - 长度预查
(?=[A-Z0-9-]{15,17}$)精准控制总长度:首字母占1位,后序15个有效字符加最多2个连字符,总长度范围为16~18位 - 保留原有连字符控制逻辑
(?:-[A-Z0-9]*){0,2},确保连字符最多出现2次,且不会出现在字符串首尾
校验效果验证
- 可正常通过的合法值:
N1234567890ABCDE、A1234-567890-12345、B1a2b3c4d5e6f7g(开启大小写不敏感时) - 会被拦截的非法值:
- 格式错误:开头为数字、连字符超过2个、连字符出现在首尾、总长度不符合要求
- 重复值:
N000000000000000、N000000-0000-00000、AAAAAAAA-AAAA-AAA这类后序有效字符全重复的值
内容的提问来源于stack exchange,提问作者Harinatha Reddy
相关产品推荐
相关产品推荐

