身份证,港澳通行证,台胞证,护照正则表达式

简介: 身份证,港澳通行证,台胞证,护照正则表达式

身份证:/^(^\d{18}$|^\d{17}(\d|X|x))$/

港澳通行证:/^([A-Z]\d{6,10}(\w1

)?)$/

台湾通行证:/^[a-zA-Z][0-9]{9}$/

护照:/^1[45][0-9]{7}$|([P|p|S|s]\d{7}$)|([S|s|G|g]\d{8}$)|([Gg|Tt|Ss|Ll|Qq|Dd|Aa|Ff]\d{8}$)|([H|h|M|m]\d{8,10})$/


旧的不行了,最新的为 新版8位或18位数字,旧版10位数字 + 英文字母


新的规则

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

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);
    }

}
相关文章
|
5月前
|
网络协议 JavaScript 前端开发
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名2
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名
1603 0
|
5月前
|
网络协议 JavaScript 前端开发
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名1
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名
425 0
|
5月前
|
JavaScript
vue常用正则表达式判断身份证格式
这两个正则表达式分别用于验证18位和15位身份证号码。请注意,正则表达式只能用于初步验证身份证格式是否正确,不能验证身份证号码是否真实有效。在实际应用中,还需要进行进一步的校验,例如校验身份证的校验位等。
281 0
|
5月前
大陆、港澳台身份证、护照、军官证的正则表达式
大陆、港澳台身份证、护照、军官证的正则表达式
706 0
|
5月前
各证件号码(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则表达式校验 完整正确
各证件号码(身份证、护照、军官证、驾驶证、港澳台湾通行证、户口簿)正则表达式校验 完整正确
633 0
|
5月前
港澳台居民大陆居住证号码正则表达式
港澳台居民大陆居住证号码正则表达式
926 0
|
5月前
|
JavaScript 前端开发 网络协议
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名3
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名
389 0
|
5月前
|
JavaScript
身份证校检正则表达式!!!
身份证校检正则表达式!!!
62 1
|
4月前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
48 2
|
4月前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。