首页 » 技术分享 » 各证件号码(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则表达式校验 完整正确

各证件号码(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则表达式校验 完整正确

 

网上种类繁多,这里整理了最详细最正确的(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则校验

package com.***.utils;

/**
 * @Description 各证件卡号校验类
 * @author longwei
 * @date 2020/7/23 14:17
 */
public class CardsUtil {

    /** 正则表达式:验证身份证 */
    public static final String REGEX_ID_CARD = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" +
            "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";

    /** 正则表达式:验证户口簿 9位数字 */
    public static final String REGEX_HUKOU_CARD = "\\d{9}";

    /** 正则表达式:验证护照 数字+字母,共9位 */
    public static final String REGEX_PASSPORT_CARD = "^([a-zA-z]|[0-9]){9}$";

    /** 正则表达式:验证军官证 汉字+8位数字 */
    public static final String REGEX_OFFICER_CARD = "^[\\u4E00-\\u9FA5](字第)([0-9a-zA-Z]{4,8})(号?)$";

    /** 正则表达式:验证驾驶证 12位数字 */
    public static final String REGEX_DRIVE_CARD = "\\d{12}$";

    /** 正则表达式:验证港澳居民通行证 H/M + 10位或8位数字 */
    public static final String REGEX_HK_CARD = "^[HMhm]{1}([0-9]{10}|[0-9]{8})$";

    /** 正则表达式:验证台湾居民通行证 新版8位或18位数字,旧版10位数字 + 英文字母 */
    public static final String REGEX_TW_CARD = "^\\d{8}|^[a-zA-Z0-9]{10}|^\\d{18}$";

    /**
     * 校验身份证
     *
     * @param idCardNo 身份证号
     * @return 校验通过返回true,否则返回false
     * @by https://blog.csdn.net/u011106915/article/details/76066985
     */
    public static boolean isIDCard(String idCardNo) {
        //校验非空
        if (StringUtil.isEmptyStr(idCardNo)) {
            return false;
        }
        //校验长度
        int idCardLength = idCardNo.length();
        if (idCardLength != 18 && idCardLength != 15) {
            return false;
        }
        // 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
        //假设18位身份证号码:41000119910101123X  410001 19910101 123X
        //^开头
        //[1-9] 第一位1-9中的一个      4
        //\\d{5} 五位数字           10001(前六位省市县地区)
        //(18|19|20)                19(现阶段可能取值范围18xx-20xx年)
        //\\d{2}                    91(年份)
        //((0[1-9])|(10|11|12))     01(月份)
        //(([0-2][1-9])|10|20|30|31)01(日期)
        //\\d{3} 三位数字            123(第十七位奇数代表男,偶数代表女)
        //[0-9Xx] 0123456789Xx其中的一个 X(第十八位为校验值)
        //$结尾

        //假设15位身份证号码:410001910101123  410001 910101 123
        //^开头
        //[1-9] 第一位1-9中的一个      4
        //\\d{5} 五位数字           10001(前六位省市县地区)
        //\\d{2}                    91(年份)
        //((0[1-9])|(10|11|12))     01(月份)
        //(([0-2][1-9])|10|20|30|31)01(日期)
        //\\d{3} 三位数字            123(第十五位奇数代表男,偶数代表女),15位身份证不含X
        //$结尾

        boolean matches = idCardNo.matches(REGEX_ID_CARD);

        //判断第18位校验值
        if (matches) {

            //如是15位身份证,不做更多校验,直接返回合法
            if (idCardLength == 15) {
                return true;
            }

            if (idCardLength == 18) {
                try {
                    char[] charArray = idCardNo.toCharArray();
                    //前十七位加权因子
                    int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
                    //这是除以11后,可能产生的11位余数对应的验证码
                    String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
                    int sum = 0;
                    for (int i = 0; i < idCardWi.length; i++) {
                        int current = Integer.parseInt(String.valueOf(charArray[i]));
                        int count = current * idCardWi[i];
                        sum += count;
                    }
                    char idCardLast = charArray[17];
                    int idCardMod = sum % 11;
                    return idCardY[idCardMod].toUpperCase().equals(String.valueOf(idCardLast).toUpperCase());

                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }

        }
        return matches;
    }

    /**
     * 校验户口簿
     *
     * @param huKouNo 户口簿号
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isHuKouCard(String huKouNo) {
        //校验非空 校验长度
        if (StringUtil.isEmptyStr(huKouNo) || huKouNo.length() != 9 ) {
            return false;
        }
        return huKouNo.matches(REGEX_HUKOU_CARD);
    }

    /**
     * 校验护照
     *
     * @param passPortNo 护照号
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isPassPortCard(String passPortNo) {
        //校验非空
        if (StringUtil.isEmptyStr(passPortNo)) {
            return false;
        }
        return passPortNo.matches(REGEX_PASSPORT_CARD);
    }

    /**
     * 校验军官证
     * 规则: 军/兵/士/文/职/广/(其他中文) + "字第" + 4到8位字母或数字 + "号"
     * 样本: 军字第2001988号, 士字第P011816X号
     * @param officerNo 军官证号
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isofficerCard(String officerNo) {
        //校验非空
        if (StringUtil.isEmptyStr(officerNo)) {
            return false;
        }
        return officerNo.matches(REGEX_OFFICER_CARD);
    }

    /**
     * 校验驾驶证
     *
     * @param driveNo 驾驶证号
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isDriveCard(String driveNo) {
        //校验非空 校验长度
        if (StringUtil.isEmptyStr(driveNo) || driveNo.length() != 12 ) {
            return false;
        }
        return driveNo.matches(REGEX_DRIVE_CARD);
    }

    /**
     * 校验港澳通行证
     *
     * @param HMNo 港澳通行证号
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isHMCard(String HMNo) {
        //校验非空
        if (StringUtil.isEmptyStr(HMNo)) {
            return false;
        }
        return HMNo.matches(REGEX_HK_CARD);
    }

    /**
     * 校验台湾通行证
     * 规则 新版8位或18位数字,旧版10位数字 + 英文字母
     * @param TWNo 台湾通行证号
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isTWCard(String TWNo) {
        //校验非空
        if (StringUtil.isEmptyStr(TWNo)) {
            return false;
        }
        return TWNo.matches(REGEX_TW_CARD);
    }

}

转载自原文链接, 如需删除请联系管理员。

原文链接:各证件号码(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则表达式校验 完整正确,转载请注明来源!

0