美文网首页
Java有效的身份证校验方法

Java有效的身份证校验方法

作者: 惟吾德馨_慧 | 来源:发表于2020-06-08 17:12 被阅读0次

    最近测试给提了不少bug,是各种输入信息的校验问题,我一看,都是小问题,一个一个改吧。其中有一个身份证校验问题,起初是度娘,博客找有效的方法,发现回归测试后,问题并没有解决,常规的身份证都校验不过。于是,自己动手,丰衣足食。上代码!

    15位、18位身份证正则式

       /**
         * 正则:身份证号码 15 位
         */
        public static final String REGEX_ID_CARD15 = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$";
        /**
         * 正则:身份证号码 18 位
         */
        public static final String REGEX_ID_CARD18 = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9Xx])$";
    

    15位、18位身份证正则式校验

    /**
         * 验证身份证号码 15 位
         *
         * @param input 待验证文本
         * @return {@code true}: 匹配<br>{@code false}: 不匹配
         */
        public static boolean isIDCard15(final CharSequence input) {
            return isMatch(REGEX_ID_CARD15, input);
        }
    
        /**
         * 验证身份证号码 18 位
         *
         * @param input 待验证文本
         * @return {@code true}: 匹配<br>{@code false}: 不匹配
         */
        public static boolean isIDCard18(final CharSequence input) {
            return isMatch(REGEX_ID_CARD18, input);
        }
    

    校验身份证号码,并获取其中的出生日期,如果出生日期是合法的日期,则身份证号码有效
    如果return null,说明该身份证号码不合格,否则号码合格

    /**
         * 校验身份证号码,并获取其中的出生日期
         * @param idCardNum
         * @return
         */
        public static String isIDCardNumGetBirth(String idCardNum) {
            if (TextUtils.isEmpty(idCardNum)) return null;
            String birthday = null;
    
            //15位身份证号的取7-12位为出生年月日,比如670101代表1967年1月1日
            //18位身份证号的取7-14位为出生年月日,比如19880101代表1988年1月1日
            if (idCardNum.length() == 15 && isIDCard15(idCardNum)) {
                birthday = "19" + idCardNum.substring(6, 8) + "-" + idCardNum.substring(8, 10) + "-" + idCardNum.substring(10, 12);
            } else if (idCardNum.length() == 18 && isIDCard18(idCardNum)) {
                birthday = idCardNum.substring(6, 10) + "-" + idCardNum.substring(10, 12) + "-" + idCardNum.substring(12, 14);
            } else return null;
            LogUtils.e("whh0603", "isIDCardNumGetBirth=" + birthday);
            SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
            sd.setLenient(false);//此处指定日期/时间解析是否不严格,在true是不严格,false时为严格
            try {
                sd.parse(birthday);//从给定字符串的开始解析文本,以生成一个日期
            } catch (ParseException e) {
                e.printStackTrace();
                return null;
            }
            return birthday;
    
            /* TODO 测试举例
            LogUtils.e("whh0603", "RegexUtils.isIDCardNumGetBirth = "
                    + RegexUtils.isIDCardNumGetBirth("231124199709150420")); //有效身份证
            LogUtils.e("whh0603", "RegexUtils.isIDCardNumGetBirth = "
                    + RegexUtils.isIDCardNumGetBirth("362228198702312844")); //无效身份证
            LogUtils.e("whh0603", "RegexUtils.isIDCardNumGetBirth = "
                    + RegexUtils.isIDCardNumGetBirth("130503670401001"));  //有效身份证 */
        }
    

    每天进步一点点。。。(2020-06-08)

    相关文章

      网友评论

          本文标题:Java有效的身份证校验方法

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