如何编写正则校验字母数字串 禁止连续重复超3次相同字符
问题背景
校验规则要求
待校验字段需同时满足两个条件:
- 仅允许由字母、数字组成
- 禁止同一字符连续重复出现3次以上(同一字符连续重复最多3次为合法)
原有方案缺陷
当前在用的正则表达式为:
^([0-9A-Z])(?!\1+$)[0-9A-Z]$
该正则存在明显逻辑错误:一方面仅能匹配长度为2的字符串,另一方面会错误拦截所有存在重复字符的场景,完全不符合实际校验需求——规则仅限制连续重复超过3次的情况,非连续重复、连续重复次数≤3的场景均属于合法范围。
校验样例
合法、非法场景对照如下:
1AAA23 -- 合法:A连续出现3次,未超阈值 2AAAA34 -- 非法:A连续出现4次,超过阈值 22A22B5 -- 合法:所有字符连续出现次数均≤2 A222256 -- 非法:2连续出现4次,超过阈值 VN00000 -- 非法:0连续出现5次,超过阈值 111123 -- 非法:1连续出现4次,超过阈值 1111AA -- 非法:1连续出现4次,超过阈值 111AAA -- 合法:1、A均连续出现3次,未超阈值
正确实现方案
使用负向先行断言排查连续4次及以上重复字符的非法场景,同时限定合法字符范围,正则表达式如下:
若仅需支持大写字母+数字(与原正则字符范围一致),使用该版本:
^(?!.*(.)\1{3})[0-9A-Z]+$
若需要同时支持大小写字母,使用该版本:
^(?!.*(.)\1{3})[0-9A-Za-z]+$
正则逻辑拆解
^:匹配字符串的起始位置,避免校验范围遗漏前缀(?!.*(.)\1{3}):负向先行断言,遍历字符串所有位置,一旦发现「任意字符+该字符连续重复3次」(即同一字符连续出现4次及以上)的片段,直接判定为不匹配[0-9A-Z]+:限定字符串所有字符必须为数字/大写字母,+表示长度至少为1,可根据实际业务需要调整为*(允许空串)或指定长度范围$:匹配字符串的结束位置,避免校验范围遗漏后缀
内容的提问来源于stack exchange,提问作者Harinatha Reddy
相关产品推荐
相关产品推荐

