手机号码正则表达式

更新日期:2019-12-24
注意更新日期,开发者要注意以后号码段更新


  • 更新日志:
    • 时间:2019-12-24
      • 工信部核发190、192、196、197号段
      • 中国广电第一次有了自己的号码段

开发项目时,总是要用到一些正则验证,就数手机号码规则比较难收集,现总结如下:

规则

  • 【数据卡】:14号段以前为上网卡专属号段,如中国联通的是145,中国移动的是147,中国电信的是149等等。

  • 【虚拟运营商】:170[1700/1701/1702]、162(电信),1703/1705/1706、165(移动),1704/1707/1708/1709(联通)、171、167(联通)

  • 【卫星通信】: 1740[0-5] (电信),1349(移动)

  • 【物联网网号】:10648、1440 (移动),10646、146(联通),10649、1410(电信)

  • 【国家工信部应急通信】:1740[6-9],1741[0-2]

  • 手机号码: 13[0-9], 14[5,6,7,8,9], 15[0-3, 5-9], 16[2,5,6,7], 17[0-8], 18[0-9], 19[0-3, 5-9]

    • 移动号段: 13[4-9],147,148,15[0-2,7-9],165,170[3,5,6],172,178,18[2-4,7-8],19[5,7,8]
    • 联通号段: 130,131,132,145,146,155,156,166,167,170[4,7,8,9],171,175,176,185,186,196
    • 电信号段: 133,149,153,162,170[0,1,2],173,174[0-5],177,180,181,189,19[0,1,3,9]
    • 广电号段: 192

实现

我是iOS开发者,所以就用Objective-c语言实现了,其它的语言自行转换

简单格式验证

如果只是需要验证手机号码的格式,可以简单写成这样:

/**
 * 手机号码格式验证
 */
+(BOOL)isMobile:(NSString *)phoneNum {
    
    NSString *MOBILE = @"^(13[0-9]|14[5-9]|15[0-3,5-9]|16[2,5,6,7]|17[0-8]|18[0-9]|19[0-3,5-9])\\d{8}$";
    NSPredicate *pred_mobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
    return [pred_mobile evaluateWithObject:phoneNum];
}

严格验证

/**
 * 手机号码格式验证
 */
+(BOOL)isTelphoneNumber:(NSString *)telNum{
    
    telNum = [telNum stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    if ([telNum length] != 11) {
        return NO;
    }
    
    /**
     * 中国移动:China Mobile
     *13[4-9],147,148,15[0-2,7-9],165,170[3,5,6],172,178,18[2-4,7-8],19[5,7,8]
     */
    NSString *CM_NUM = @"^((13[4-9])|(14[7-8])|(15[0-2,7-9])|(165)|(178)|(18[2-4,7-8])|(19[5,7,8]))\\d{8}|(170[3,5,6])\\d{7}$";
    
    /**
     * 中国联通:China Unicom
     * 130,131,132,145,146,155,156,166,167,170[4,7,8,9],171,175,176,185,186,196
     */
    NSString *CU_NUM = @"^((13[0-2])|(14[5,6])|(15[5-6])|(16[6-7])|(17[1,5,6])|(18[5,6])|(196))\\d{8}|(170[4,7-9])\\d{7}$";
    
    /**
     * 中国电信:China Telecom
     * 133,149,153,162,170[0,1,2],173,174[0-5],177,180,181,189,19[0,1,3,9]
     */
    NSString *CT_NUM = @"^((133)|(149)|(153)|(162)|(17[3,7])|(18[0,1,9])|(19[0,1,3,9]))\\d{8}|((170[0-2])|(174[0-5]))\\d{7}$";

    /**
     * 中国广电:China Broadcasting Network
     * 192
     */
    NSString *CBN_NUM = @"^((192))\\d{8}$";
    
    NSPredicate *pred_CM = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",CM_NUM];
    NSPredicate *pred_CU = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",CU_NUM];
    NSPredicate *pred_CT = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",CT_NUM];
    NSPredicate *pred_CBN = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CBN_NUM];
    BOOL isMatch_CM = [pred_CM evaluateWithObject:telNum];
    BOOL isMatch_CU = [pred_CU evaluateWithObject:telNum];
    BOOL isMatch_CT = [pred_CT evaluateWithObject:telNum];
    BOOL isMatch_CBN = [pred_CBN evaluateWithObject:telNum];
    if (isMatch_CM || isMatch_CT || isMatch_CU || isMatch_CBN) {
        return YES;
    }
    
    return NO;
}

当然,上面的正则方法分拆开来,就可以单独验证号段的归属了!
PS:携号转网这种特殊情况,咱们就先不考虑了,考虑了也没用!

更新日期:2019-12-24

你可能感兴趣的:(手机号码正则表达式)