You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则实现:匹配除999外三个及以上连续重复数字的校验方法

手机号连续重复数字校验正则方案

规则回顾

  • 合法手机号为10-25位纯数字
  • 禁止出现除连续3个9(即999)之外的,任意数字连续重复3次及以上的情况
  • 不合法示例:
    • 8777267331:包含连续3个重复的7
    • 000:长度不足,且包含连续3个重复的0
    • 66667878763:包含连续4个重复的6
  • 合法示例:767886655999(包含连续3个9,符合例外规则)

原有正则问题

你之前使用的\b(\d)\3+\b存在3个核心问题:

  1. 反向引用序号错误:仅定义了1个捕获组(\d),反向引用需要用\1,写\3无法匹配到对应分组,规则完全失效
  2. 未做例外排除:会把合法的999场景也判定为非法
  3. 边界和长度校验缺失:用\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:33:17