美文网首页
身份证号码正则

身份证号码正则

作者: 水中的蓝天 | 来源:发表于2020-06-15 15:40 被阅读0次

本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢。

身份证号码规则:

  • 前1、2位数字表示:所在省份的代码;

  • 第3、4位数字表示:所在城市的代码;

  • 第5、6位数字表示:所在区县的代码;

  • 第7-14位数字表示:出生年、月、日;

  • 第15、16位数字表示:所在地的派出所的代码;

  • 第17位数字表示性别:奇数表示男性,偶数表示女性;

  • 第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0-9的数字,有时也用x表示。
    法律依据:
    《GB11643-1999公民身份号码》规定,公民身份号码的编码对象、号码的结构和表示形式,使每个编码对象获得一个唯一的、不变的法定号码。

  • 校验码计算

公式.png

计算公式令结果为 Y,Y的计算公式为:Y = mod(S, 11)根据下表找出 Y 对应的校验码即为要求身份证号码的校验码C。

校验码.png

例如:假设某女性居民的
15位身份证号码是320105820927512,32表示江苏省,01表示南京市,05表示鼓楼区,820927表示1982年9月27日。512表示是该地区,其中2表示是女性。那么,升级为18位后的号码为32010519820927512C。下面就根据公式来计算C的值。
Y = mod(S, 11)=MOD(313,11)=5
根据校验值对应表,可知C=7,该人员身份证号码为:
320105198209275127

补齐后.png

又如:某男性公民身份证号码的本体码为: 34052419800101001
计算公式令结果为 Y,Y的计算公式为:Y = mod(S, 11)根据下表找出 Y 对应的校验码即为要求身份证号码的校验码C。

校验.png

/**
 校验身份证号码是否正确 返回BOOL值

 @param idCardString 身份证号码
 @return 返回BOOL值 YES or NO
 */
- (BOOL)xyh_verifyIDCardString:(NSString *)idCardString {

    NSString *regex = @"^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
    BOOL isRe = [predicate evaluateWithObject:idCardString];

    if (!isRe) {
         //身份证号码格式不对
        NSLog(@"身份证号码格式不正确");
        return NO;
    }

    //加权因子 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2
    NSArray *weightingArray = @[@"7", @"9", @"10", @"5", @"8", @"4", @"2", @"1", @"6", @"3", @"7", @"9", @"10", @"5", @"8", @"4", @"2"];
    //校验码 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2
    NSArray *verificationArray = @[@"1", @"0", @"10", @"9", @"8", @"7", @"6", @"5", @"4", @"3", @"2"];
    
    NSInteger sum = 0;//保存前17位各自乖以加权因子后的总和
    for (int i = 0; i < weightingArray.count; i++) {//将前17位数字和加权因子相乘的结果相加
        NSString *subStr = [idCardString substringWithRange:NSMakeRange(i, 1)];
        sum += [subStr integerValue] * [weightingArray[i] integerValue];
    }
    
    NSInteger modNum = sum % 11;//总和除以11取余
    NSString *idCardMod = verificationArray[modNum]; //根据余数取出校验码
    NSString *idCardLast = [idCardString.uppercaseString substringFromIndex:17]; //获取身份证最后一位
    
    if (modNum == 2) {//等于2时 idCardMod为10  身份证最后一位用X表示10
        idCardMod = @"X";
    }
    if ([idCardLast isEqualToString:idCardMod]) { //身份证号码验证成功
        return YES;
    } else { //身份证号码验证失败
        return NO;
    }
}

相关文章

  • 常用正则表达式留影

    基本的正则表达式的应用 座机加手机号 简单手机的正则表达式 身份证号码的正则表达式 密码验证 email验证

  • 3.正则表达式使用基础:括号(一)

    3.1分组 假设有这么一个需求,我们需要匹配身份证号码。各位可以思考下怎么写正则表达式。身份证号码生成规则:长度1...

  • 身份证号码正则

    本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗...

  • go web接收参数的验证

    必填字段验证: 密码的正则验证 数字验证: 中文验证: 英文验证 电子邮箱验证: 手机号码验证: 身份证号码 十八...

  • 常用正则表达式

    身份证号码: [1-9]\d{14}(\d{2}[0-9x])? 网页中的超链接: 正则表达式匹配表格: E-m...

  • iOS 身份证号码校验

    问题:身份证校验 最近在公司项目中遇到身份证号码校验的问题,按照之前经验都是直接撸袖子上正则匹配,简单粗暴出成果。...

  • 正则验证身份证号码

    第二代身份证号码编排规则 先认识一下身份证:第二代身份证号码编排规则 具体规则 实现

  • 正则验证身份证号码

    /^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/

  • 身份证号码正则表达

    xxxxxx yyyy MM dd 375 0 十八位 xxxxxx yy MM dd 75 0...

  • iOS 正则表达式

    1,常用元字符 2,常用正则表达式 1,手机号 2,身份证号码 3,邮箱 4,IP验证 5,密码验证 6,0到10...

网友评论

      本文标题:身份证号码正则

      本文链接:https://www.haomeiwen.com/subject/wbxhxktx.html