iOS验证手机号,身份证正则表达式

/*

手机号码 13[0-9],14[5|7|9],15[0-3],15[5-9],17[0|1|3|5|6|8],18[0-9]

移动:134[0-8],13[5-9],147,15[0-2],15[7-9],178,18[2-4],18[7-8]

联通:13[0-2],145,15[5-6],17[5-6],18[5-6]

电信:133,1349,149,153,173,177,180,181,189

虚拟运营商: 170[0-2]电信  170[3|5|6]移动 170[4|7|8|9],171 联通

上网卡又称数据卡,14号段为上网卡专属号段,中国联通上网卡号段为145,中国移动上网卡号段为147,中国电信上网卡号段为149

*/

#pragma mark 正则判断手机号码地址格式

+ (BOOL)isMobileNumber:(NSString *)mobileNum{

NSString *pattern = @"^1[3578]\\d{9}$";

//      NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";

NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];

if (([regextestmobile evaluateWithObject:mobileNum] == YES)){

return YES;

}else{

return NO;

}

}

#pragma mark -- 判读身份证

+(BOOL)checkUserID:(NSString *)userID{

//长度不为18的都排除掉

if (userID.length!=18) {

return NO;

}

//校验格式

NSString *regex2 = @"^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$";

NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];

BOOL flag = [identityCardPredicate evaluateWithObject:userID];

if (!flag) {

return flag;    //格式错误

}else{

//格式正确在判断是否合法

//将前17位加权因子保存在数组里

NSArray * idCardWiArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];

//这是除以11后,可能产生的11位余数、验证码,也保存成数组

NSArray * idCardYArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];

//用来保存前17位各自乖以加权因子后的总和

NSInteger idCardWiSum = 0;

for(int i = 0;i < 17;i++){

NSInteger subStrIndex = [[userID substringWithRange:NSMakeRange(i, 1)] integerValue];

NSInteger idCardWiIndex = [[idCardWiArray objectAtIndex:i] integerValue];

idCardWiSum+= subStrIndex * idCardWiIndex;

}

//计算出校验码所在数组的位置

NSInteger idCardMod=idCardWiSum%11;

//得到最后一位身份证号码

NSString * idCardLast= [userID substringWithRange:NSMakeRange(17, 1)];

//如果等于2,则说明校验码是10,身份证号码最后一位应该是X

if(idCardMod==2){

if([idCardLast isEqualToString:@"X"]||[idCardLast isEqualToString:@"x"]){

return YES;

}else{

return NO;

}

}else{

//用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码

if([idCardLast isEqualToString: [idCardYArray objectAtIndex:idCardMod]]){

return YES;

}else{

return NO;

}

}

}

}

#pragma mark -- 车牌号格式校验

+(BOOL)checkCarID:(NSString *)carID;{

if (carID.length!=7) {

return NO;

}

NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-hj-zA-HJ-Z]{1}[a-hj-zA-HJ-Z_0-9]{4}[a-hj-zA-HJ-Z_0-9_\u4e00-\u9fa5]$";

NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carRegex];

return [carTest evaluateWithObject:carID];

}

#pragma mark -- 6~16位数字/字母/下划线组成的密码格式校验

+(BOOL)checkPsw:(NSString *)pswStr{

NSString * pattern  =  @"^[A-Za-z0-9_]{6,16}$";

//    NSString *condition =@"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,16}";

NSPredicate * pred  =  [NSPredicate predicateWithFormat:@"SELF MATCHES %@",pattern];

return [pred evaluateWithObject:pswStr];

}

#pragma mark --判断字符串是否全为[(数字)OR(数字|字母)OR(字母)OR(汉字)]

+(BOOL)isAllNumber:(NSString *)string{

NSString *condition = @"^[0-9]*$";//是否都是数字

//    NSString *condition = @"^[A-Za-z]+$";//是否都是字母

//    NSString *condition = @"^[A-Za-z0-9]+$";//是否都是字母和数字{6,16}

//    NSString *condition = @"^[A-Za-z0-9]{6,16}$";//是否都是字母和数字且长度在[6,16]

//    NSString *condition = @"^[\u4e00-\u9fa5]{0,}$";//只能输入汉字

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",condition];

return [predicate evaluateWithObject:string];

}

#pragma mark --银行卡格式验证

+(BOOL)isBankCard:(NSString *)bankCard{

if (bankCard.length < 16) {

return NO;

}

NSInteger oddsum = 0;    //奇数求和

NSInteger evensum = 0;    //偶数求和

NSInteger allsum = 0;

NSInteger cardNoLength = (NSInteger)[bankCard length];

// 取了最后一位数

NSInteger lastNum = [[bankCard substringFromIndex:cardNoLength-1] intValue];

//测试的是除了最后一位数外的其他数字

bankCard = [bankCard substringToIndex:cardNoLength - 1];

for (NSInteger i = cardNoLength -1 ; i>=1;i--) {

NSString *tmpString = [bankCard substringWithRange:NSMakeRange(i-1, 1)];

NSInteger tmpVal = [tmpString integerValue];

if (cardNoLength % 2 ==1 ) {//卡号位数为奇数

if((i % 2) == 0){//偶数位置

tmpVal *= 2;

if(tmpVal>=10)

tmpVal -= 9;

evensum += tmpVal;

}else{//奇数位置

oddsum += tmpVal;

}

}else{

if((i % 2) == 1){

tmpVal *= 2;

if(tmpVal>=10)

tmpVal -= 9;

evensum += tmpVal;

}else{

oddsum += tmpVal;

}

}

}

allsum = oddsum + evensum;

allsum += lastNum;

if((allsum % 10) == 0)

return YES;

else{

return NO;

}

#pragma mark --邮箱格式验证

+(BOOL)isEmail:(NSString *)email{

NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";

NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];

return [emailTest evaluateWithObject:email];

}

#pragma mark --移动号码验证

/**

*  是否是移动号

* 中国移动:China Mobile

* 134[0-8],13[5-9],147,15[0-2],15[7-9],170[3|5|6],178,18[2-4],18[7-8]

*/

+(BOOL)isCMMobilePhone:(NSString *)phoneNum{

NSString * CM = @"^1(34[0-8]|70[356]|(3[5-9]|4[7]|5[0-27-9]|7[8]|8[2-47-8])\\d)\\d{7}$";

NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];

if ([regextestcm evaluateWithObject:phoneNum]) {

return YES;

}

return NO;

}

#pragma mark --是否是联通号

/**

*  是否是联通号

* 中国联通:China Unicom

* 13[0-2],145,15[5-6],17[5-6],18[5-6],170[4|7|8|9],171

*/

+(BOOL)isCUMobilePhone:(NSString *)phoneNum{

NSString * CU = @"^1(70[07-9]|(3[0-2]|4[5]|5[5-6]|7[15-6]|8[5-6])\\d)\\d{7}$";

NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];

if ([regextestcu evaluateWithObject:phoneNum]) {

return YES;

}

return NO;

}

#pragma mark --是否是电信号

/**

*  是否是电信号

* 中国电信:China Telecom

* 133,1349,149,153,173,177,180,181,189,170[0-2]

*/

+(BOOL)isCTMobilePhone:(NSString *)phoneNum{

NSString * CT = @"^1(34[9]|70[0-2]|(3[3]|4[9]|5[3]|7[37]|8[019])\\d)\\d{7}$";

NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];

if ([regextestct evaluateWithObject:phoneNum]) {

return YES;

}

return NO;

}

大部分是参考网上大神的总结,主要是为了给自己作个笔记,方便以后查找使用,感谢大神肉身佛陀的分享。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容