身份证号码有效性检测
2017-03-21 16:23
246 查看
身份证号码有效性检测
在开发软件的时候有些注册需要身份证号等信息,并且要求号码的正确性。简单的身份证号码有效性检测
- (BOOL)verifyIdentityCardNum { NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$"; return [self q_isValidateByRegex:regex2]; }
精确的身份证号码有效性检测
- (BOOL)verifyIdentityCardNum { NSString *value = [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; int length =0; if (!value) { return NO; } else { length = (int)value.length; if (length !=15 && length !=18) { return NO; } } // 省份代码 NSArray *areasArray =@[@"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"]; NSString *valueStart2 = [value substringToIndex:2]; BOOL areaFlag =NO; for (NSString *areaCode in areasArray) { if ([areaCode isEqualToString:valueStart2]) { areaFlag =YES; break; } } if (!areaFlag) { return false; } NSRegularExpression *regularExpression; NSUInteger numberofMatch; int year =0; switch (length) { case 15: year = [value substringWithRange:NSMakeRange(6,2)].intValue +1900; if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) { // 测试出生日期的合法性 regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$" options:NSRegularExpressionCaseInsensitive error:nil]; } else { // 测试出生日期的合法性 regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$" options:NSRegularExpressionCaseInsensitive error:nil]; } numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, value.length)]; if (numberofMatch >0) { return YES; } else { return NO; } case 18: year = [value substringWithRange:NSMakeRange(6,4)].intValue; if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) { // 测试出生日期的合法性 regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$" options:NSRegularExpressionCaseInsensitive error:nil]; } else { // 测试出生日期的合法性 regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$" options:NSRegularExpressionCaseInsensitive 4000 error:nil]; } numberofMatch = [regularExpression numberOfMatchesInString:value options:NSMatchingReportProgress range:NSMakeRange(0, value.length)]; if (numberofMatch > 0) { int S = ([value substringWithRange:NSMakeRange(0, 1)].intValue + [value substringWithRange:NSMakeRange(10, 1)].intValue) * 7 + ([value substringWithRange:NSMakeRange(1, 1)].intValue + [value substringWithRange:NSMakeRange(11, 1)].intValue) * 9 + ([value substringWithRange:NSMakeRange(2, 1)].intValue + [value substringWithRange:NSMakeRange(12, 1)].intValue) * 10 + ([value substringWithRange:NSMakeRange(3, 1)].intValue + [value substringWithRange:NSMakeRange(13, 1)].intValue) * 5 + ([value substringWithRange:NSMakeRange(4, 1)].intValue + [value substringWithRange:NSMakeRange(14, 1)].intValue) * 8 + ([value substringWithRange:NSMakeRange(5, 1)].intValue + [value substringWithRange:NSMakeRange(15, 1)].intValue) * 4 + ([value substringWithRange:NSMakeRange(6, 1)].intValue + [value substringWithRange:NSMakeRange(16, 1)].intValue) * 2 + [value substringWithRange:NSMakeRange(7, 1)].intValue * 1 + [value substringWithRange:NSMakeRange(8, 1)].intValue * 6 + [value substringWithRange:NSMakeRange(9, 1)].intValue * 3; int Y = S % 11; NSString *M =@"F"; NSString *JYM =@"10X98765432"; M = [JYM substringWithRange:NSMakeRange(Y,1)]; // 判断校验位 if ([M isEqualToString:[value substringWithRange:NSMakeRange(17,1)]]) { return YES; // 检测 ID 的校验位 } else { return NO; } } else { return NO; } default: return NO; } }
银行卡号、ip 地址、车牌号等等正则会持续更新上去。
相关文章推荐
- WPF应用Binding之数据有效性检测
- [android网络有效性检测] NetworkMonitor代码造成内存泄漏
- xpath抓取代理IP并检测IP的有效性
- 编程实现邮件地址有效性检测
- 代理IP 有效性检测
- xpath抓取代理IP并检测IP的有效性
- 检测苹果推送证书有效性
- 《Windows核心编程》---检测PE文件有效性
- 今天理解的一条编程规范:检测变量的有效性
- 邮箱有效性检测(nslookup -q=mx)
- C#学习之三---检测输入的有效性
- 身份证号码图像提取--基于canny边缘检测的连通域检测算法
- 身份证号码有效性检测算法 ( js版 转 .net版 )
- 正则简单检测字符有效性
- 身份证号码有效性检测算法 ( js版 转 C#版 )
- 链路的有效性检测
- 身份证号码有效性检测算法 ( js版 转 C#版 )
- 链接有效性检测程序
- TCP连接有效性检测方法