/*手机号码验证 MODIFIED BY HELENSONG*/
- (BOOL)isMobileNumber:(NSString *)mobileNum
{
/**
* 手机号码
* 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
* 联通:130,131,132,152,155,156,185,186
* 电信:133,1349,153,180,189
*/
NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
/**
10 * 中国移动:China Mobile
11 * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
12 */
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
/**
15 * 中国联通:China Unicom
16 * 130,131,132,152,155,156,185,186
17 */
NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
/**
20 * 中国电信:China Telecom
21 * 133,1349,153,180,189
22 */
NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
/**
25 * 大陆地区固话及小灵通
26 * 区号:010,020,021,022,023,024,025,027,028,029
27 * 号码:七位或八位
28 */
// NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
if (([regextestmobile evaluateWithObject:mobileNum] == YES)
|| ([regextestcm evaluateWithObject:mobileNum] == YES)
|| ([regextestct evaluateWithObject:mobileNum] == YES)
|| ([regextestcu evaluateWithObject:mobileNum] == YES))
{
return YES;
}
else
{
return NO;
}
- (BOOL)isMobileNumber:(NSString *)mobileNum
{
/**
* 手机号码
* 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
* 联通:130,131,132,152,155,156,185,186
* 电信:133,1349,153,180,189
*/
NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
/**
10 * 中国移动:China Mobile
11 * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
12 */
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
/**
15 * 中国联通:China Unicom
16 * 130,131,132,152,155,156,185,186
17 */
NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
/**
20 * 中国电信:China Telecom
21 * 133,1349,153,180,189
22 */
NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
/**
25 * 大陆地区固话及小灵通
26 * 区号:010,020,021,022,023,024,025,027,028,029
27 * 号码:七位或八位
28 */
// NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
if (([regextestmobile evaluateWithObject:mobileNum] == YES)
|| ([regextestcm evaluateWithObject:mobileNum] == YES)
|| ([regextestct evaluateWithObject:mobileNum] == YES)
|| ([regextestcu evaluateWithObject:mobileNum] == YES))
{
return YES;
}
else
{
return NO;
}
}
//以上集合一起,并兼容14开头的
+ (BOOL)isMobileNumber:(NSString *)mobileNum
{
NSString * phoneRegex = @"^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$";
BOOL isMatch = [mobileNum isMatchedByRegex:phoneRegex];
return isMatch;
}
身份证的正则校验
-
在ios项目的开发中可能很多地方都需要用到身份证校验,一般在开发的时候很多人都是直接百度去网上荡相关的正则表达式和校验代码,但是网上疯狂粘贴复制的校验代码本身也可能并不准确,可能会有风险,比如2013年1月1号起停止使用15位的身份证,网上的身份证校验普遍支持15位的号码。在开发过程中,进行类似处理的时候,还是需要一些甄别的能力的,当然也要考虑自己的项目的实际情况。该文贴出了最近项目中使用到得身份证校验代码,以方便有需要的人“谨慎”获取。一、规则下面是iOS身份证校验规则,对于第6点就值得商榷,按道理出生年份前两位是20也应该是合理的。如果要校验投保人需要年满18岁,需要另行检查,不应放在身份证校验里面。长度必须是18位,前17位必须是数字,第十八位可以是数字或X(校验时不区分大小写)前两位必须是以下35种情形中的一种: 11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91第7到第14位出生年月日。第7到第10位为出生年份;11到12位表示月份,范围为01~12;13到14位为合法的日期,比如月份是04,范围应是01~30第17位表示性别,必须是0或1,0表示女,1表示男第18位为前17位的校验位 算法如下:总和 = (n1 + n11) * 7 + (n2 + n12) * 9 + (n3 + n13) * 10 + (n4 + n14) * 5 + (n5 + n15) * 8 + (n6 + n16) * 4 + (n7 + n17) * 2 + n8 + n9 * 6 + n10 * 3,其中n1表示1位数字,其它类似用总和除以11,看余数是多少, 余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2第7位必须为1,第8位必须为9,即:出生年份的前两位必须是19二、代码示例:对于这种需要在很多地方都用到的代码,可以使用一个工具类或者是分类来写。这里把校验的代码写在了一个工具类中。VerifyRegexTool.h文件代码:1 #import <Foundation/Foundation.h>23 @interface VerifyRegexTool : NSObject45 + (BOOL)verifyIsNotEmpty:(NSString *)str; //验证是否不为空67 + (BOOL)verifyText:(NSString *)text withRegex:(NSString *)regex; //正则验证89 + (BOOL)verify IDCardNumber:(NSString *)value; //验证身份证1011 + (BOOL)verifyCardNumberWithSoldier:(NSString *)value; //验证军官证或警官证1213 + (BOOL)verifyIDCardHadAdult:(NSString *)card; //验证身份证是否成年且小于100岁****这个方法中不做身份证校验,请确保传入的是正确身份证1415 + (BOOL)verifyIDCardMoreThanPointDate:(NSString *)card withNumber:(NSInteger)number withAddTimeInterval:(NSTimeInterval)interval withDateType:(DateType)dateType; //验证身份证加上指定天数是否大于指定number的类型1617 + (BOOL)verifyIDCardLessThanPointDate:(NSString *)card withNumber:(NSInteger)number withAddTimeInterval:(NSTimeInterval)interval withDateType:(DateType)dateType; //验证身份证是否小于指定number的类型181920 + (NSString *)getIDCardBirthday:(NSString *)card; //得到身份证的生日****这个方法中不做身份证校验,请确保传入的是正确身份证21 + (NSInteger)getIDCardSex:(NSString *)card; //得到身份证的性别(1男0女)****这个方法中不做身份证校验,请确保传入的是正确身份证2223 @endVerifyRegexTool.m文件代码:1 #import "VerifyRegexTool.h"23 @implementation VerifyRegexTool45 //验证是否不为空6 + (BOOL)verifyIsNotEmpty:(NSString *)str7 {8 if (!str) return NO;910 str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];11 if (![str isEqualToString:@""]) {12 return YES;13 } else {14 return NO;15 }16 }1718 //正则验证19 + (BOOL)verifyText:(NSString *)text withRegex:(NSString *)regex20 {21 return [[text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] isMatchedByRegex:regex];22 }2324 //验证身份证25 //必须满足以下规则26 //1. 长度必须是18位,前17位必须是数字,第十八位可以是数字或X27 //2. 前两位必须是以下情形中的一种:11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,9128 //3. 第7到第14位出生年月日。第7到第10位为出生年份;11到12位表示月份,范围为01-12;13到14位为合法的日期29 //4. 第17位表示性别,双数表示女,单数表示男30 //5. 第18位为前17位的校验位31 //算法如下:32 //(1)校验和 = (n1 + n11) * 7 + (n2 + n12) * 9 + (n3 + n13) * 10 + (n4 + n14) * 5 + (n5 + n15) * 8 + (n6 + n16) * 4 + (n7 + n17) * 2 + n8 + n9 * 6 + n10 * 3,其中n数值,表示第几位的数字33 //(2)余数 = 校验和 % 1134 //(3)如果余数为0,校验位应为1,余数为1到10校验位应为字符串“0X98765432”(不包括分号)的第余数位的值(比如余数等于3,校验位应为9)35 //6. 出生年份的前两位必须是19或2036 + (BOOL)verifyIDCardNumber:(NSString *)value37 {38 value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];39 if ([value length] != 18) {40 return NO;41 }42 NSString *mmdd = @"(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))";43 NSString *leapMmdd = @"0229";44 NSString *year = @"(19|20)[0-9]{2}";45 NSString *leapYear = @"(19|20)(0[48]|[2468][048]|[13579][26])";46 NSString *yearMmdd = [NSString stringWithFormat:@"%@%@", year, mmdd];47 NSString *leapyearMmdd = [NSString stringWithFormat:@"%@%@", leapYear, leapMmdd];48 NSString *yyyyMmdd = [NSString stringWithFormat:@"((%@)|(%@)|(%@))", yearMmdd, leapyearMmdd, @"20000229"];49 NSString *area = @"(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|82|[7-9]1)[0-9]{4}";50 NSString *regex = [NSString stringWithFormat:@"%@%@%@", area, yyyyMmdd , @"[0-9]{3}[0-9Xx]"];5152 NSPredicate *regexTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];53 if (![regexTest evaluateWithObject:value]) {54 return NO;55 }56 int summary = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *757 + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *958 + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *1059 + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *560 + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *861 + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *462 + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *263 + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *664 + [value substringWithRange:NSMakeRange(9,1)].intValue *3;65 NSInteger remainder = summary % 11;66 NSString *checkBit = @"";67 NSString *checkString = @"10X98765432";68 checkBit = [checkString substringWithRange:NSMakeRange(remainder,1)];// 判断校验位69 return [checkBit isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]];70 }7172 //验证军官证或警官证73 //必须是下面两种格式中的一种74 //格式一:4到20位数字75 //格式二:大于或等于10位并且小于等于20位(中文按两位),并满足以下规则76 //1)必须有“字第”两字77 //2)“字第”前面有至少一个字符78 //3)“字第”后是4位以上数字79 + (BOOL)verifyCardNumberWithSoldier:(NSString *)value80 {81 NSString *s1 = @"^\\d*$";82 NSString *s2 = @"^.{1,}字第\\d{4,}$";83 //NSString *s3 = @"^([A-Za-z0-9\\u4e00-\\u9fa5])*$";84 value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];85 if ([VerifyRegexTool verifyText:value withRegex:s1]) {86 NSString *s11 = @"^\\d{4,20}$";87 return [value isMatchedByRegex:s11];88 } else if ([self lengthUsingChineseCharacterCountByTwo:value] >= 1089 && [self lengthUsingChineseCharacterCountByTwo:value] <= 20) {90 return [value isMatchedByRegex:s2];91 }9293 return NO;94 }9596 + (NSUInteger)lengthUsingChineseCharacterCountByTwo:(NSString *)string{97 NSUInteger count = 0;98 for (NSUInteger i = 0; i< string.length; ++i) {99 if ([string characterAtIndex:i] < 256) {100 count++;101 } else {102 count += 2;103 }104 }105 return count;106 }107108 //验证身份证是否成年且小于100岁****这个方法中不做身份证校验,请确保传入的是正确身份证109 + (BOOL)verifyIDCardHadAdult:(NSString *)card110 {111 NSString *birtday = [VerifyRegexTool getIDCardBirthday:card]; //****年**月**日112 //转换为****-**-**113 birtday = [birtday stringByReplacingOccurrencesOfString:@"年" withString:@"-"];114 birtday = [birtday stringByReplacingOccurrencesOfString:@"月" withString:@"-"];115 birtday = [birtday stringByReplacingOccurrencesOfString:@"日" withString:@""];116 birtday = [NSString stringWithFormat:@"%@ 00:00",birtday];117 NSDate *dateBirtday = [NSDate dateFromString:birtday];118 NSInteger year = [[NSDate date] getIntervalTime:dateBirtday withDateType:DateTypeYear]; //得到年数119120 if (year >= 18 && year < 100) {121 return YES;122 } else {123 return NO;124 }125126 }127128 //验证身份证加上指定天数是否大于指定number的类型129 + (BOOL)verifyIDCardMoreThanPointDate:(NSString *)card withNumber:(NSInteger)number withAddTimeInterval:(NSTimeInterval)interval withDateType:(DateType)dateType {130 NSString *birtday = [VerifyRegexTool getIDCardBirthday:card]; //****年**月**日131 //转换为****-**-**132 birtday = [birtday stringByReplacingOccurrencesOfString:@"年" withString:@"-"];133 birtday = [birtday stringByReplacingOccurrencesOfString:@"月" withString:@"-"];134 birtday = [birtday stringByReplacingOccurrencesOfString:@"日" withString:@""];135 birtday = [NSString stringWithFormat:@"%@ 00:00",birtday];136 NSDate *dateBirtday = [NSDate dateFromString:birtday];137 NSDate *today = [NSDate dateFromStringWithoutTime:[[NSDate date] strDate]];138 NSDate *pointDate = [today dateByAddingTimeInterval:interval];139140 //tempDate为number后的日期141 NSDate *tempDate = [pointDate dateAddNumber:-number withDateType:dateType]; //临界日期142 if ([dateBirtday earlierDate:tempDate] == dateBirtday) { //如果生日+指定天数大雨tempdate,则通过143 return YES;144 } else {145 return NO;146 }147 }148149 //验证身份证加上指定天数是否小于指定number的类型150 + (BOOL)verifyIDCardLessThanPointDate:(NSString *)card withNumber:(NSInteger)number withAddTimeInterval:(NSTimeInterval)interval withDateType:(DateType)dateType151 {152 NSString *birtday = [VerifyRegexTool getIDCardBirthday:card]; //****年**月**日153 //转换为****-**-**154 birtday = [birtday stringByReplacingOccurrencesOfString:@"年" withString:@"-"];155 birtday = [birtday stringByReplacingOccurrencesOfString:@"月" withString:@"-"];156 birtday = [birtday stringByReplacingOccurrencesOfString:@"日" withString:@""];157 birtday = [NSString stringWithFormat:@"%@ 00:00",birtday];158 NSDate *dateBirtday = [NSDate dateFromString:birtday];159 NSDate *today = [NSDate dateFromStringWithoutTime:[[NSDate date] strDate]];160 NSDate *pointDate = [today dateByAddingTimeInterval:interval];161162 //tempDate为number后的日期163 NSDate *tempDate = [pointDate dateAddNumber:-number withDateType:dateType]; //临界日期164 if ([tempDate earlierDate:dateBirtday] == tempDate) { //如果生日+指定天数小于tempdate,则通过165 return YES;166 } else {167 return NO;168 }169 }170171 //得到身份证的生日****这个方法中不做身份证校验,请确保传入的是正确身份证172 + (NSString *)getIDCardBirthday:(NSString *)card {173 card = [card stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];174 if ([card length] != 18) {175 return nil;176 }177 NSString *birthady = [NSString stringWithFormat:@"%@年%@月%@日",[card substringWithRange:NSMakeRange(6,4)], [card substringWithRange:NSMakeRange(10,2)], [card substringWithRange:NSMakeRange(12,2)]];178 return birthady;179 }180181 //得到身份证的性别(1男0女)****这个方法中不做身份证校验,请确保传入的是正确身份证182 + (NSInteger)getIDCardSex:(NSString *)card {183 card = [card stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];184 NSInteger defaultValue = 0;185 if ([card length] != 18) {186 return defaultValue;187 }188 NSInteger number = [[card substringWithRange:NSMakeRange(16,1)] integerValue];189 if (number % 2 == 0) { //偶数为女190 return 0;191 } else {192 return 1;193 }194 }195196 @end身份证校验调用示例:1 if (![VerifyRegexTool verifyIDCardNumber:self.IdentityCardNOTextfield.text]) { //验证身份证是否真实2 [self showMessageHUD:@"请输入正确的身份证号码!" withTimeInterval:kShowMessageTime];3 return;4 }
-
在分享一个比较全的介绍正则的http://www.2cto.com/kf/201412/365795.html