Java有效的身份证校验方法

2020-06-08  本文已影响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)

上一篇下一篇

猜你喜欢

热点阅读