正则编写:拦截前三位重复(除888外)的10-25位电话号码
电话号码校验正则实现方案
直接使用以下正则即可满足全部校验规则:
^(?!([0-79])\1{2})\d{10,25}$
原有正则的问题
你之前使用的\b(\d)\3+\b存在3个核心问题,导致匹配不符合预期:
- 反向引用序号错误:正则中仅定义了1个捕获组,反向引用需要用
\1,\3指向不存在的捕获组,匹配逻辑完全失效 - 校验范围错误:该写法会匹配字符串任意位置的连续重复数字,不符合仅校验号码前三位的要求
- 缺失核心规则:没有做10-25位的长度限制,也没有对888开头的合法场景做白名单放行
正则逻辑拆解
^:锚定字符串起始位置,确保从号码首位开始校验(?!([0-79])\1{2}):负向先行断言做非法开头拦截:如果号码前三位是除888外的三位重复数字(000/111/.../777/999),直接判定匹配失败\d{10,25}:匹配10-25位纯数字,满足长度校验要求$:锚定字符串结束位置,避免号码前后混入非数字字符
匹配效果验证
- 合法样例放行:
88876565451:888开头,长度11位,匹配通过7687987555:非三位重复数字开头,长度10位,末尾连续重复的5不触发前三位校验规则,匹配通过
- 非法样例拦截:
666879876577:666开头,属于非888的三位重复开头,拦截4448765654567:444开头,属于非888的三位重复开头,拦截- 长度不足10位、超过25位、包含非数字字符的输入,均会被拦截
内容的提问来源于stack exchange,提问作者Avatar Girase
相关产品推荐
相关产品推荐

