iOS开发实用技巧?身份证的正则校验
作者:网络转载 发布时间:[ 2015/1/27 17:48:08 ] 推荐标签:软件开发 iOS 操作系统
VerifyRegexTool.m文件代码:
1#import"VerifyRegexTool.h"
2
3@implementationVerifyRegexTool
4
5//验证是否不为空
6+(BOOL)verifyIsNotEmpty:(NSString*)str
7{
8if(!str)returnNO;
9
10str=[strstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]];
11if(![strisEqualToString:@""]){
12returnYES;
13}else{
14returnNO;
15}
16}
17
18//正则验证
19+(BOOL)verifyText:(NSString*)textwithRegex:(NSString*)regex
20{
21return[[textstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceCharacterSet]]isMatchedByRegex:regex];
22}
23
24//验证身份证
25//必须满足以下规则
26//1.长度必须是18位,前17位必须是数字,第十八位可以是数字或X
27//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,91
28//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)余数=校验和%11
34//(3)如果余数为0,校验位应为1,余数为1到10校验位应为字符串“0X98765432”(不包括分号)的第余数位的值(比如余数等于3,校验位应为9)
35//6.出生年份的前两位必须是19或20
36+(BOOL)verifyIDCardNumber:(NSString*)value
37{
38value=[valuestringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];
39if([valuelength]!=18){
40returnNO;
41}
42NSString*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])))";
43NSString*leapMmdd=@"0229";
44NSString*year=@"(19|20)[0-9]{2}";
45NSString*leapYear=@"(19|20)(0[48]|[2468][048]|[13579][26])";
46NSString*yearMmdd=[NSStringstringWithFormat:@"%@%@",year,mmdd];
47NSString*leapyearMmdd=[NSStringstringWithFormat:@"%@%@",leapYear,leapMmdd];
48NSString*yyyyMmdd=[NSStringstringWithFormat:@"((%@)|(%@)|(%@))",yearMmdd,leapyearMmdd,@"20000229"];
49NSString*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}";
50NSString*regex=[NSStringstringWithFormat:@"%@%@%@",area,yyyyMmdd,@"[0-9]{3}[0-9Xx]"];
51
52NSPredicate*regexTest=[NSPredicatepredicateWithFormat:@"SELFMATCHES%@",regex];
53if(![regexTestevaluateWithObject:value]){
54returnNO;
55}
56intsummary=([valuesubstringWithRange:NSMakeRange(0,1)].intValue+[valuesubstringWithRange:NSMakeRange(10,1)].intValue)*7
57+([valuesubstringWithRange:NSMakeRange(1,1)].intValue+[valuesubstringWithRange:NSMakeRange(11,1)].intValue)*9
58+([valuesubstringWithRange:NSMakeRange(2,1)].intValue+[valuesubstringWithRange:NSMakeRange(12,1)].intValue)*10
59+([valuesubstringWithRange:NSMakeRange(3,1)].intValue+[valuesubstringWithRange:NSMakeRange(13,1)].intValue)*5
60+([valuesubstringWithRange:NSMakeRange(4,1)].intValue+[valuesubstringWithRange:NSMakeRange(14,1)].intValue)*8
61+([valuesubstringWithRange:NSMakeRange(5,1)].intValue+[valuesubstringWithRange:NSMakeRange(15,1)].intValue)*4
62+([valuesubstringWithRange:NSMakeRange(6,1)].intValue+[valuesubstringWithRange:NSMakeRange(16,1)].intValue)*2
63+[valuesubstringWithRange:NSMakeRange(7,1)].intValue*1+[valuesubstringWithRange:NSMakeRange(8,1)].intValue*6
64+[valuesubstringWithRange:NSMakeRange(9,1)].intValue*3;
65NSIntegerremainder=summary%11;
66NSString*checkBit=@"";
67NSString*checkString=@"10X98765432";
68checkBit=[checkStringsubstringWithRange:NSMakeRange(remainder,1)];//判断校验位
69return[checkBitisEqualToString:[[valuesubstringWithRange:NSMakeRange(17,1)]uppercaseString]];
70}
71
72//验证军官证或警官证
73//必须是下面两种格式中的一种
74//格式一:4到20位数字
75//格式二:大于或等于10位并且小于等于20位(中文按两位),并满足以下规则
76//1)必须有“字第”两字
77//2)“字第”前面有至少一个字符
78//3)“字第”后是4位以上数字
79+(BOOL)verifyCardNumberWithSoldier:(NSString*)value
80{
81NSString*s1=@"^\d*$";
82NSString*s2=@"^.{1,}字第\d{4,}$";
83//NSString*s3=@"^([A-Za-z0-9\u4e00-\u9fa5])*$";
84value=[valuestringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];
85if([VerifyRegexToolverifyText:valuewithRegex:s1]){
86NSString*s11=@"^\d{4,20}$";
87return[valueisMatchedByRegex:s11];
88}elseif([selflengthUsingChineseCharacterCountByTwo:value]>=10
89&&[selflengthUsingChineseCharacterCountByTwo:value]<=20){
90return[valueisMatchedByRegex:s2];
91}
92
93returnNO;
94}
95
96+(NSUInteger)lengthUsingChineseCharacterCountByTwo:(NSString*)string{
97NSUIntegercount=0;
98for(NSUIntegeri=0;i<string.length;++i){
99if([stringcharacterAtIndex:i]<256){
100count++;
101}else{
102count+=2;
103}
104}
105returncount;
106}
107
108//验证身份证是否成年且小于100岁****这个方法中不做身份证校验,请确保传入的是正确身份证
109+(BOOL)verifyIDCardHadAdult:(NSString*)card
110{
111NSString*birtday=[VerifyRegexToolgetIDCardBirthday:card];//****年**月**日
112//转换为****-**-**
113birtday=[birtdaystringByReplacingOccurrencesOfString:@"年"withString:@"-"];
114birtday=[birtdaystringByReplacingOccurrencesOfString:@"月"withString:@"-"];
115birtday=[birtdaystringByReplacingOccurrencesOfString:@"日"withString:@""];
116birtday=[NSStringstringWithFormat:@"%@00:00",birtday];
117NSDate*dateBirtday=[NSDatedateFromString:birtday];
118NSIntegeryear=[[NSDatedate]getIntervalTime:dateBirtdaywithDateType:DateTypeYear];//得到年数
119
120if(year>=18&&year<100){
121returnYES;
122}else{
123returnNO;
124}
125
126}
127
128//验证身份证加上指定天数是否大于指定number的类型
129+(BOOL)verifyIDCardMoreThanPointDate:(NSString*)cardwithNumber:(NSInteger)numberwithAddTimeInterval:(NSTimeInterval)intervalwithDateType:(DateType)dateType{
130NSString*birtday=[VerifyRegexToolgetIDCardBirthday:card];//****年**月**日
131//转换为****-**-**
132birtday=[birtdaystringByReplacingOccurrencesOfString:@"年"withString:@"-"];
133birtday=[birtdaystringByReplacingOccurrencesOfString:@"月"withString:@"-"];
134birtday=[birtdaystringByReplacingOccurrencesOfString:@"日"withString:@""];
135birtday=[NSStringstringWithFormat:@"%@00:00",birtday];
136NSDate*dateBirtday=[NSDatedateFromString:birtday];
137NSDate*today=[NSDatedateFromStringWithoutTime:[[NSDatedate]strDate]];
138NSDate*pointDate=[todaydateByAddingTimeInterval:interval];
139
140//tempDate为number后的日期
141NSDate*tempDate=[pointDatedateAddNumber:-numberwithDateType:dateType];//临界日期
142if([dateBirtdayearlierDate:tempDate]==dateBirtday){//如果生日+指定天数大雨tempdate,则通过
143returnYES;
144}else{
145returnNO;
146}
147}
148
149//验证身份证加上指定天数是否小于指定number的类型
150+(BOOL)verifyIDCardLessThanPointDate:(NSString*)cardwithNumber:(NSInteger)numberwithAddTimeInterval:(NSTimeInterval)intervalwithDateType:(DateType)dateType
151{
152NSString*birtday=[VerifyRegexToolgetIDCardBirthday:card];//****年**月**日
153//转换为****-**-**
154birtday=[birtdaystringByReplacingOccurrencesOfString:@"年"withString:@"-"];
155birtday=[birtdaystringByReplacingOccurrencesOfString:@"月"withString:@"-"];
156birtday=[birtdaystringByReplacingOccurrencesOfString:@"日"withString:@""];
157birtday=[NSStringstringWithFormat:@"%@00:00",birtday];
158NSDate*dateBirtday=[NSDatedateFromString:birtday];
159NSDate*today=[NSDatedateFromStringWithoutTime:[[NSDatedate]strDate]];
160NSDate*pointDate=[todaydateByAddingTimeInterval:interval];
161
162//tempDate为number后的日期
163NSDate*tempDate=[pointDatedateAddNumber:-numberwithDateType:dateType];//临界日期
164if([tempDateearlierDate:dateBirtday]==tempDate){//如果生日+指定天数小于tempdate,则通过
165returnYES;
166}else{
167returnNO;
168}
169}
170
171//得到身份证的生日****这个方法中不做身份证校验,请确保传入的是正确身份证
172+(NSString*)getIDCardBirthday:(NSString*)card{
173card=[cardstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];
174if([cardlength]!=18){
175returnnil;
176}
177NSString*birthady=[NSStringstringWithFormat:@"%@年%@月%@日",[cardsubstringWithRange:NSMakeRange(6,4)],[cardsubstringWithRange:NSMakeRange(10,2)],[cardsubstringWithRange:NSMakeRange(12,2)]];
178returnbirthady;
179}
180
181//得到身份证的性别(1男0女)****这个方法中不做身份证校验,请确保传入的是正确身份证
182+(NSInteger)getIDCardSex:(NSString*)card{
183card=[cardstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];
184NSIntegerdefaultValue=0;
185if([cardlength]!=18){
186returndefaultValue;
187}
188NSIntegernumber=[[cardsubstringWithRange:NSMakeRange(16,1)]integerValue];
189if(number%2==0){//偶数为女
190return0;
191}else{
192return1;
193}
194}
195
196@end
|
身份证校验调用示例:
1if(![VerifyRegexToolverifyIDCardNumber:self.IdentityCardNOTextfield.text]){//验证身份证是否真实
2[selfshowMessageHUD:@"请输入正确的身份证号码!"withTimeInterval:kShowMessageTime];
3return;
4}
|
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
浅谈操作系统对内存的管理HBase佳实践??用好你的操作系统选择适合Rails开发的操作系统三问:Linux操作系统安全加固卡巴斯基面向物联网设备发布专用操作系统卡巴斯基正式推出操作系统:非Linux,主打安全,秘研14年Linux以外的7种开源操作系统现代操作系统 - 存储设备看操作系统对程序的执行过程有哪些支持谷歌正开发融合操作系统Fuchsia,真的有必要吗?iOS在印度连第二名都排不上 本土操作系统太强大了解决Linux操作系统下AES解密失败的问题如何保护你的Linux操作系统?谷歌:安卓操作系统前景不容乐观韩国发布自主操作系统TmaxOS:兼容安卓、iOS和Windows摆脱安卓/WP依赖,华为将做自主操作系统
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南