身份证的校验

(最简单的利用正则表达式)

了解编码规则

  • 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
  • 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

如何完成身份证的校验

/ ^ [1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;

身份证号码的正则表达式
前6位地区编码(dddddd)

  数字开头不能为0 取1-9数字。后五位可以为0-9的数字。
正则表达式: /^ [ 1-9 ] \d{5}/

  • " ^ "匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。
  • " [ " 标记一个中括号表达式的开始
出生年月日(yymmdd)

  • 多为19**、20** 还可能存在18**
    所以这一部分正则表达式为:/(18|19|20)\d{2}/
    表示18、19、20后可在输入两位确切的年份例1999可通过校验。

  • 如果属于0-9月,则第一位为0第二位为1-9;
    如果属于10-12月,则第一位数字为1第二位为0-2.
    正则表达式: /((0[1-9])|(1[0-2]))/

  • 最大范围为:1-31。
    分为三部分
    1-9日,第一位为0第二位为1-9;
    10-19,第一位为1第二位为0-9;
    20-29,第一位为2第二位为0-9;
    30-31,第一位为3第二位为0-1;
    简化:第一位数字为0-2,第二位数字为1-9或者是10,20,30,31
    正则表达式:/(([0-2][1-9])|10|20|30|31)/
顺序编码(xxp)

顺序码总共为3位,p代表性别,奇数为男、偶数为女。
正则表达式 :/\d{3}/

校验码(y)

校验码,该位数值可通过前17位计算获得
数值为0-9或者x X
正则表达式:/[0-9Xx]/

校验码规则:

  • 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]

  • 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
    余数   [ 0, 1, 2 ,3 , 4 , 5 , 6 , 7 , 8 ,9 ,10]

  • 如果验证码恰好是10,为了保证身份证是十八位,那么第十八位将用X来代替
    (余数为2,对应10用x下面有详解)

  • 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )

  • i为身份证号码1…17 位; Y_P为校验码Y所在校验码数组位置

实例:

  某男性的身份证号码为【53010219200508011x】, 我们看看这个身份证是不是合法的身份证。

  • 首先我们得出前17位的乘积和【(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2)】是189。
  • 用189除以11得出的结果是189/11=17----2,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。

初步判断代码

    public void judge(String idNumber) {
        //正则表达式
        String regIdNumber="^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
        boolean isMatch= Pattern.matches(regIdNumber,idNumber);
        if (isMatch){
            System.out.println("通过验证");
        }else{
            System.out.println("身份证号有误");
        }
    }

增加校验码判断

    public void judge(String idNumber) {
        //正则表达式初步判断
        String regIdNumber="^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
        boolean isMatch= Pattern.matches(regIdNumber,idNumber);
        int sum=0;
        //如果初步判断成功进入校验码判断
        if (isMatch){
            if(idNumber.length()==18);
            //加权因子
            int[] idNo={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
            int i=0;
            for (i=0;i<17;i++){
                sum+=(Integer.parseInt(String.valueOf(idNumber.charAt(i))))*idNo[i];
            }
            i=sum%11;
            if (i==2){
                if(idNumber.substring(17).equals("x")||idNumber.substring(17).equals("X"))
                    System.out.println("身份证合格");
                else System.out.println("校验失败");
            }else if (Integer.parseInt(String.valueOf(idNumber.charAt(i)))==idNo[i]){
                System.out.println("校验失败");
            }else {
                System.out.println("身份证不正确");
            }
        }else{
            System.out.println("身份证号格式有误");
        }
    }
发布了29 篇原创文章 · 获赞 10 · 访问量 7482

猜你喜欢

转载自blog.csdn.net/qmqm33/article/details/102329763