Java正则实现:匹配除999外三个及以上连续重复数字的校验方法
手机号连续重复数字校验正则方案
规则回顾
- 合法手机号为10-25位纯数字
- 禁止出现除连续3个9(即
999)之外的,任意数字连续重复3次及以上的情况 - 不合法示例:
8777267331:包含连续3个重复的7000:长度不足,且包含连续3个重复的066667878763:包含连续4个重复的6
- 合法示例:
767886655999(包含连续3个9,符合例外规则)
原有正则问题
你之前使用的\b(\d)\3+\b存在3个核心问题:
- 反向引用序号错误:仅定义了1个捕获组
(\d),反向引用需要用\1,写\3无法匹配到对应分组,规则完全失效 - 未做例外排除:会把合法的
999场景也判定为非法 - 边界和长度校验缺失:用
\b做边界容易受输入上下文干扰,且没有限制10-25位的长度要求,短串、带其他字符的串会出现误判
正确正则实现
根据业务对连续9的容忍度,分两种版本:
版本1:允许任意长度的连续9(仅拦截0-8的3位及以上连续重复)
如果业务允许出现9999、99999这类多个连续9的场景,使用以下正则,整串匹配通过即为合法号码:
^(?!.*([0-8])\1{2,})\d{10,25}$
正则逻辑说明:
^/$匹配整串首尾,避免部分匹配漏判(?!.*([0-8])\1{2,})为负向预查:只要串中任意位置出现0-8的数字连续重复3次及以上,直接判定匹配失败\d{10,25}限定串为10-25位纯数字
版本2:仅允许恰好3位连续9(4位及以上连续9也拦截)
如果业务只允许出现恰好3位连续的9,9999这类4位及以上连续9也需要拦截,使用以下正则:
^(?!.*(?:(\d)\1{3,}|([0-8])\2{2}))\d{10,25}$
正则逻辑说明:
负向预查额外拦截了所有数字连续出现4次及以上的场景,仅保留999这一种3位连续重复的合法情况,完全匹配给出的规则示例。
用例验证结果
| 测试号码 | 版本1判定 | 版本2判定 | 结果说明 |
|---|---|---|---|
| 8777267331 | 不合法 | 不合法 | 存在连续3个7,命中拦截规则 |
| 000 | 不合法 | 不合法 | 长度不足,且存在连续3个0 |
| 66667878763 | 不合法 | 不合法 | 存在连续4个6,命中拦截规则 |
| 767886655999 | 合法 | 合法 | 仅存在连续3个9,符合例外规则 |
| 13999923456 | 合法 | 不合法 | 存在连续4个9,版本2额外拦截 |
内容的提问来源于stack exchange,提问作者Avatar Girase
相关产品推荐
相关产品推荐

