手机号验证正则表达式:实现拒绝连续重复数字的校验
实现带连续重复数字检测的手机号验证
没问题,我来帮你搞定这个带连续重复数字检测的手机号验证功能~
需求拆解
你原来的正则^[6-9]\\d{9}$只能验证10位印度手机号的基础格式(开头是6-9,后面跟着9位数字),但没法过滤掉全相同数字的无效号码(比如6666666666、9111111111这类明显不符合常理的号码)。我们需要修改正则,加上对连续重复数字序列的检测逻辑。
调整后的正则及解释
这里分两种场景给你方案,你可以按需选择:
场景1:拒绝全相同数字的手机号
用你注释里的思路优化后的正则,确保严格匹配10位长度:
NSString *regExPattern = @"^[6-9](\\d)(?!\\1{8}$)\\d{8}$";
正则逻辑说明:
^[6-9]:锁定手机号开头必须是6-9的数字(\\d):捕获第二位数字,用来做后续重复检测(?!\\1{8}$):负向前瞻断言——确保后面的8位数字不全是和捕获到的第二位数字一样的(这样整个10位号码就不会出现全相同的情况)\\d{8}:匹配剩下的8位数字,保证总长度刚好10位
场景2:拒绝任意位置出现连续3个及以上相同数字的手机号
如果需要更严格的校验(比如6222345678这种带连续3个2的号码也想拒绝),可以用这个正则:
NSString *regExPattern = @"^(?!.*(\\d)\\1\\1)[6-9]\\d{9}$";
正则逻辑说明:
^(?!.*(\\d)\\1\\1):负向前瞻断言——先检查整个字符串里有没有连续3个相同的数字,如果有直接判定无效[6-9]\\d{9}$:再验证基础的10位手机号格式
完整代码示例
把你的代码替换成下面的版本,这里以场景1的全相同数字检测为例:
-(BOOL) validatePhone:(NSString*) phoneString { // 拒绝全相同数字的10位印度手机号正则 NSString *regExPattern = @"^[6-9](\\d)(?!\\1{8}$)\\d{8}$"; // 如果需要禁止连续3个及以上相同数字,替换成下面这行: // NSString *regExPattern = @"^(?!.*(\\d)\\1\\1)[6-9]\\d{9}$"; NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil]; NSUInteger regExMatches = [regEx numberOfMatchesInString:phoneString options:0 range:NSMakeRange(0, [phoneString length])]; // 匹配成功(次数为1)则返回YES,否则NO return regExMatches == 1; }
测试效果
- ✅ 有效号码:
6123456789、9876543210 - ❌ 无效号码(场景1):
6666666666、9111111111 - ❌ 无效号码(场景2):
6222345678、6111234567
内容的提问来源于stack exchange,提问作者LeXeR
相关产品推荐
相关产品推荐

