证件类型、证件号码、性别、出生日期校验(身份证、户口簿、港澳居民居住证、台湾居民居住证、港澳居民来往内地通行证、台湾居民来往大陆通行证、境外永久居住证、外国人永久居留身份证、护照、其他)

证件类型、证件号码、性别、出生日期校验(身份证、户口簿、港澳居民居住证、台湾居民居住证、港澳居民来往内地通行证、台湾居民来往大陆通行证、境外永久居住证、外国人永久居留身份证、护照、其他)_第1张图片

校验工具类


import com.xx.xx.dic.CertificateType;

/**
 * 证件类型校验工具类
 */
public class CertificateValidateUtil {
    public static String validate(String xm, String xb, String zjlx, String zjhm, String csrq) {
        //1.基于证件号码编码规则进行校验
        //1.1 若证件号码符合身份证编码规则,校验证件号码前两位和证件类型;
        if (ValidatorUtil.isSfzh(zjhm)) {
            int theFirstTwo = Integer.parseInt(zjhm.substring(0, 2));

            //前两位小于等于65、但证件类型不是“居民身份证”或“居民户口簿”,报错:证件类型与证件号码不一致(证件号码符合[居民身份证]编码规则);
            if (theFirstTwo <= 65 && !CertificateType.JMSFZ.getCode().equals(zjlx) && !CertificateType.JMHKB.getCode().equals(zjlx)) {
                return "E00_证件类型与证件号码不一致(证件号码符合[居民身份证]编码规则)";
            }

            //前两位为81、82,但证件类型不是“港澳居民居住证”,报错:证件类型与证件号码不一致(证件号码符合[港澳居民居住证]编码规则);
            if ((theFirstTwo == 81 || theFirstTwo == 82) && !CertificateType.GAJMJZZ.getCode().equals(zjlx)) {
                return "E00_证件类型与证件号码不一致(证件号码符合[港澳居民居住证]编码规则)";
            }

            //前两位为83,但证件类型不是“台湾居民居住证”,报错:证件类型与证件号码不一致(证件号码符合[台湾居民居住证]编码规则);
            if (theFirstTwo == 83 && !CertificateType.TWJMJZZ.getCode().equals(zjlx)) {
                return "E00_证件类型与证件号码不一致(证件号码符合[台湾居民居住证]编码规则)";
            }

        }

        //1.2若证件号码不符合身份证编码规则,校验长度,首字母,第2-8位,证件类型;
        if (!isSfzh(zjhm)) {

            // 长度为9、第1位为英文字符“H”或“M”,第2-8位是数字,但证件类型不是“港澳居民来往内地通行证”,报错:证件类型与证件号码不一致(证件号码符合[港澳居民来往内地通行证]特征);
            if (zjhm.length() == 9) {
                char theFirst = zjhm.charAt(0);
                String theTwo2Eight = zjhm.substring(1, 8);
                if ((theFirst == 'H' || theFirst == 'M') && ValidatorUtil.isNumber(theTwo2Eight) && !CertificateType.GAJMLWNDTXZ.getCode().equals(zjlx)) {
                    return "E00_证件类型与证件号码不一致(证件号码符合[港澳居民来往内地通行证]特征)";
                }
            }

            //长度为8、纯数字、与出入境接口“台湾居民来往大陆通行证”比对一致,但证件类型不是“台湾居民来往大陆通行证”,报错:证件类型与证件号码不一致(证件号码符合[台湾居民来往大陆通行证]特征);
            if (zjhm.length() == 8 && ValidatorUtil.isNumber(zjhm) && !CertificateType.TWJMLWNDTXZ.getCode().equals(zjlx)) {
                return "E00_证件类型与证件号码不一致(证件号码符合[台湾居民来往大陆通行证]特征)";
            }

        }

        //2基于证件类型与证件号码、姓名、出生日期、性别进行关联校验
        //2.1若证件类型为居民身份证或居民户口簿
        if (CertificateType.JMSFZ.getCode().equals(zjlx) || CertificateType.JMHKB.getCode().equals(zjlx)) {

            //若证件号码不符合身份证编码规则或证件号码前两位大于65,报错:证件号码不规范(不符合[居民身份证编码]规则);
            if (!isSfzh(zjhm)) {
                return "E00_证件号码不规范(不符合[居民身份证编码]规则)";
            }
            int theFirstTwo = Integer.valueOf(zjhm.substring(0, 2));
            if (theFirstTwo > 65) {
                return "E00_证件号码不规范(不符合[居民身份证编码]规则)";
            }

            //若证件号码符合身份证编码规则,证件号码前两位小于等于65,但姓名不符合中文规范(只能包含汉字、中间分隔符'·'或大写拼音字母),报错:姓名不规范;
            if (!isGoodChineseName(xm)) {
                return "E00_姓名不规范";
            }

            //证件号码前两位小于等于65,但证件号码第7 - 14 位与出生日期不一致,报错:出生日期与证件号码不一致;
            String theSeven2Twelve = zjhm.substring(6, 14);
            if (!theSeven2Twelve.equals(csrq)) {
                return "E00_出生日期与证件号码不一致";
            }

            //证件号码前两位小于等于65,但证件号码第17位与性别不一致,报错:性别与证件号码不一致;
            int theSeventeen = Integer.valueOf(zjhm.charAt(16));
            if (!((theSeventeen % 2 == 0 && xb.equals("女")) || (theSeventeen % 2 != 0 && xb.equals("男")))) {
                return "E00_性别与证件号码不一致";
            }

        }

        //2.2若证件类型为港澳居民居住证
        if (CertificateType.GAJMJZZ.getCode().equals(zjlx)) {
            //若证件号码不符合身份证编码规则或证件号码前六位不是810000、820000,报错:证件号码不规范(不符合[港澳居民居住证]编码规则);
            if (!isSfzh(zjhm)) {
                return "E00_证件号码不规范(不符合[港澳居民居住证]编码规则)";
            }
            String theFirstSix = zjhm.substring(0, 6);
            if (!theFirstSix.equals("810000") && !theFirstSix.equals("820000")) {
                return "E00_证件号码不规范(不符合[港澳居民居住证]编码规则)";
            }

            //若证件号码符合身份证编码规则且证件号码前六位是810000或820000
            //姓名不符合中文规范(只能包含汉字、中间分隔符'·'或大写拼音字母),报错:姓名不规范;
            if (!isGoodChineseName(xm)) {
                return "E00_姓名不规范";
            }

            //证件号码第7-14位与出生日期不一致,报错:出生日期与证件号码不一致;
            String theSeven2Twelve = zjhm.substring(6, 14);
            if (!theSeven2Twelve.equals(csrq)) {
                return "E00_出生日期与证件号码不一致";
            }

            //证件号码第17位与性别不一致,报错:性别与证件号码不一致;
            int theSeventeen = Integer.valueOf(zjhm.charAt(16));
            if (!((theSeventeen % 2 == 0 && xb.equals("女")) || (theSeventeen % 2 != 0 && xb.equals("男")))) {
                return "E00_性别与证件号码不一致";
            }
        }

        //3.若证件类型为台湾居民居住证
        if (CertificateType.TWJMJZZ.getCode().equals(zjlx)) {
            //3.1若证件号码不符合身份证编码规则或证件号码前六位不是830000,报错:证件号码不规范(不符合[台湾居民居住证]编码规则);
            if (!isSfzh(zjhm)) {
                return "E00_证件号码不规范(不符合[台湾居民居住证]编码规则)";
            }
            String theFirstSix = zjhm.substring(0, 6);
            if (!theFirstSix.equals("830000")) {
                return "E00_证件号码不规范(不符合[台湾居民居住证]编码规则)";
            }

            //若证件号码符合身份证编码规则且证件号码前六位是830000
            //姓名不符合中文规范(只能包含汉字、中间分隔符 '·' 或大写拼音字母),报错:姓名不规范;
            if (!isGoodChineseName(xm)) {
                return "E00_姓名不规范";
            }

            //若证件号码符合身份证编码规则且证件号码前六位是830000,但证件号码第7 - 14 位与出生日期不一致,报错:出生日期与证件号码不一致;
            String theSeven2Twelve = zjhm.substring(6, 14);
            if (!theSeven2Twelve.equals(csrq)) {
                return "E00_出生日期与证件号码不一致";
            }

            //若证件号码符合身份证编码规则且证件号码前六位是830000,但证件号码第17位与性别不一致,报错:性别与证件号码不一致;
            int theSeventeen = Integer.valueOf(zjhm.charAt(16));
            if (!((theSeventeen % 2 == 0 && xb.equals("女")) || (theSeventeen % 2 != 0 && xb.equals("男")))) {
                return "E00_性别与证件号码不一致";
            }

        }

        //4.若证件类型为港澳居民来往内地通行证
        if (CertificateType.GAJMLWNDTXZ.getCode().equals(zjlx)) {
            //若证件号码不符合证件特征(长度为9、第1位为英文字符“H”或“M”,第2-8位是数字),报错:证件号码不规范(与[港澳居民来往内地通行证]证件特征不符);
            if (zjhm.length() != 9) {
                return "E00_证件号码不规范(与[港澳居民来往内地通行证]证件特征不符)";
            }
            char theFirst = zjhm.charAt(0);
            String theTwo2Eight = zjhm.substring(1, 8);
            if ((theFirst != 'H' && theFirst != 'M') || !ValidatorUtil.isNumber(theTwo2Eight)) {
                return "E00_证件号码不规范(与[港澳居民来往内地通行证]证件特征不符)";
            }

            //若姓名不符合中文规范(只能包含汉字、中间分隔符'·'或大写拼音字母),报错:姓名不规范;
            if (!isGoodChineseName(xm)) {
                return "E00_姓名不规范";
            }

        }

        //5.若证件类型为台湾居民来往大陆通行证
        if (CertificateType.TWJMLWNDTXZ.getCode().equals(zjlx)) {
            //若证件号码不符合证件特征(长度为8、纯数字),报错:证件号码不规范(与[台湾居民来往大陆通行证]证件特征不符);
            if (zjhm.length() != 8 || !ValidatorUtil.isNumber(zjhm)) {
                return "E00_证件号码不规范(与[台湾居民来往大陆通行证]证件特征不符)";
            }

            //若姓名不符合中文规范(只能包含汉字、中间分隔符'·'或大写拼音字母),报错:姓名不规范;
            if (!isGoodChineseName(xm)) {
                return "E00_姓名不规范";
            }
        }

        //6.若证件类型为境外永久居住证或外国人永久居留身份证
        if (CertificateType.JWYJJZZ.getCode().equals(zjlx) || CertificateType.WGRYJJLSFZ.getCode().equals(zjlx)) {
            //若姓名不符合中文规范,也不符合英文规范(必须是大写英文字母,中间分隔符允许空格),报错:姓名不规范;
            if (!isGoodChineseName(xm) && !isEnglishName(xm)) {
                return "E00_姓名不规范";
            }
        }

        //7.若证件类型为护照或其他
        if (CertificateType.HZ.getCode().equals(zjlx) || CertificateType.QT.getCode().equals(zjlx)) {
            //若姓名不符合中文规范(只能包含汉字、中间分隔符'·'或大写拼音字母),报错:姓名不规范;
            if (!isGoodChineseName(xm)) {
                return "E00_姓名不规范";
            }
        }

        return "";
    }
}

证件类型枚举


import org.apache.commons.lang.StringUtils;

public enum CertificateType {
    JMSFZ("居民身份证", "1"), JMHKB("居民户口簿", "B"), GAJMJZZ("港澳居民居住证", "D"),
    TWJMJZZ("台湾居民居住证", "E"), GAJMLWNDTXZ("港澳居民来往内地通行证", "Y"), TWJMLWNDTXZ("台湾居民来往大陆通行证", "8"),
    JWYJJZZ("境外永久居住证", "9"), WGRYJJLSFZ("外国人永久居留身份证", "F"), HZ("护照", "A"), QT("其他", "Z");

    private String name;
    private String code;

    CertificateType(String name, String code) {
        this.name = name;
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public String getCode() {
        return code;
    }

    public static CertificateType getByName(String name) {
        if (StringUtils.isBlank(name)) {
            return QT;
        } else {
            CertificateType[] items = values();
            for (CertificateType item : items) {
                if (item.getName().equals(name)) {
                    return item;
                }
            }
            return QT;
        }
    }

    public static CertificateType getByCode(String code) {
        if (StringUtils.isBlank(code)) {
            return QT;
        } else {
            CertificateType[] items = values();
            for (CertificateType item : items) {
                if (item.getCode().equals(code)) {
                    return item;
                }
            }
            return QT;
        }
    }
}

身份证规则校验

public static boolean isSfzh(String sfzh) {
        return StringUtils.isBlank(sfzh) ? false : contains(sfzh, "(^\\d{15}$)|(^(\\d){17}([\\d|X|x|x|X])$)");
    }

中文英文姓名校验

/**
     * 中文姓名:必须是汉字、大写字母和“·”的组合,“·”不能在姓名的首尾
     * @param xm
     * @return
     */
    public static boolean isGoodChineseName(String xm) {
        if (StringUtils.isBlank(xm)) {
            return false;
        }
        if (xm.startsWith("·") || xm.endsWith("·")) {
            return false;
        }
        String str = xm.replaceAll("[\u4e00-\u9fa5A-Z·]", "");
        if (str.length() > 0) {//
            return false;
        }
        return true;
    }
    
    /**
     * 英文姓名:应为大写字母,中间允许1个空格,允许有英文逗号
     * @param xm
     * @return
     */
    public static boolean isGoodEnglishName(String xm) {
        if (StringUtils.isBlank(xm)) {
            return false;
        }
        Pattern p = Pattern.compile("[\\s]{2,}");
        Matcher m = p.matcher(xm);
        if (m.find()) {
            return false;
        }
        String str = xm.replaceAll("[A-Z,\\s]", "");
        return str.length() == 0;
    }

你可能感兴趣的:(java,java,开发语言)