Java 常用校验工具类

目录

1、校验个人身份证、证件类型、证件号之间的关系 

2、校验身份证有效期是否合规

3、校验手机号

4、银行卡校验

5、校验中文姓名

6、校验英文姓名

7、校验固定电话

8、校验是否包含汉字

9、校验电子邮箱

10、校验企业证件类型和证件号


1、校验个人身份证、证件类型、证件号之间的关系 

    //校验国籍与证件类型,证件号码以及年龄的关系
    public static String checkNativeplaceByIdTypeandIdNoandAge(String sign, String nativeplace, String idType, String idno, Integer age, String birthDay) {
        String errorMsg = "";
        if (StringUtils.isBlank(idType) || StringUtils.isBlank(idno) || age == null || StringUtils.isBlank(birthDay)) {
            errorMsg = "校验国籍与证件类型,证件号码以及年龄的关系失败,参数有误!";
            return errorMsg;
        }
        //中国
        if (StringUtils.isNotBlank(nativeplace)) {
            if (nativeplace.equals("CHN")) {
                if (!idType.matches("^[045]+$")) {
                    if (sign.equals("1") || sign.equals("3")) {
                        errorMsg += "国籍为中国时 证件类型仅允许选择 身份证!";
                    } else {
                        errorMsg += "国籍为中国时 证件类型仅允许选择 身份证、户口簿、出生证明!";
                    }
                }
            }
            //非中国、中国香港、中国澳门、中国台湾国籍
            if (!Arrays.asList(new String[]{"CHN", "HKG", "MAC", "TWN"}).contains(nativeplace)) {
                if (!idType.equals("1")) {
                    errorMsg += "非中国大陆居民、中国香港、中国澳门、中国台湾居民的外籍客户 证件类型暂只接受护照!";
                }
            }
            //中国香港、中国澳门
            if (Arrays.asList(new String[]{"HKG", "MAC"}).contains(nativeplace)) {
                if (!idType.matches("^[7e]+$")) {
                    errorMsg += "国籍为中国香港、中国澳门时 证件类型仅允许选择 港澳居民来往大陆通行证和港澳居民居住证";
                }
            }
            //中国台湾
            if (nativeplace.equals("TWN")) {
                if (!idType.matches("^[6f]+$")) {
                    errorMsg += "国籍为中国台湾时 证件类型仅允许选择 台湾居民来往大陆通行证和台湾居民居住证";
                }
            }
        }
        if (idType.matches("^[0]+$")) {
            switch (idType) {
                case "4":
                    if (age >= 16) {
                        errorMsg += "16周岁以下证件类型才可选户口本!";
                    } else {
                        if (!idno.matches("(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)")) {
                            errorMsg += "户口本填写有误(18位数字或17位数字+X)!";
                        }
                    }
                    break;
                case "7":
                    if (age >= 2) {
                        errorMsg += "2周岁以下证件类型才可选出生证!";
                    } else {
                        if (!idno.matches("[a-zA-Z]{1}[0-9]{9}")) {
                            errorMsg += "出生证填写有误(字母+9位数字)!";
                        }
                    }
                    break;
            }
        } else if (idType.equals("1")) {
            if (idno.length() > 18 || idno.length() < 8) {
                errorMsg += "护照填写有误(8-18位字符)!";
            }
        } else if (idType.equals("I")) {//先保留不删除
            if (!idno.matches("^([0-9A-Za-z]{15})|([0-9A-Za-z]{18})")) {
                errorMsg += "外国人永久居留身份证填写有误(15或18位的数字或字母)!";
            }
        } else if (idType.equals("7")) {
            if (nativeplace != null && !"".equals(nativeplace)) {
                if (nativeplace.equals("HKG")) {
                    if (!idno.matches("[H]{1}[0-9]{8}")) {
                        errorMsg += "港澳居民来往大陆通行证填写有误(H+8位数字)!";
                    }
                } else if (nativeplace.equals("MAC")) {
                    if (!idno.matches("[M]{1}[0-9]{8}")) {
                        errorMsg += "港澳居民来往大陆通行证填写有误(M+8位数字)!";
                    }
                }
            }
        } else if (idType.equals("e")) {
            if (idno.length() != 18) {
                errorMsg += "港澳居民居住证填写有误(18位)!";
            } else {
                if (nativeplace != null && !"".equals(nativeplace)) {
                    if (nativeplace.equals("HKG") && (!idno.substring(0, 6).equals("810000") || !idno.substring(6, 14).equals(birthDay.replace("-", "")) || !idno.substring(14, 18).matches("[0-9A-Za-z]{4}"))) {
                        errorMsg += "港澳居民居住证填写有误(810000+8位出生日期+4位数字或字母)!";
                    }
                    if (nativeplace.equals("MAC") && (!idno.substring(0, 6).equals("820000") || !idno.substring(6, 14).equals(birthDay.replace("-", "")) || !idno.substring(14, 18).matches("[0-9A-Za-z]{4}"))) {
                        errorMsg += "港澳居民居住证填写有误(820000+8位出生日期+4位数字或字母)!";
                    }
                }
            }
        } else if (idType.equals("6")) {
            if (!idno.matches("^\\d{8}$")) {
                errorMsg += "台湾居民来往大陆通行证填写有误(8位数字)!";
            }
        } else if (idType.equals("f")) {
            if (idno.length() != 18) {
                errorMsg += "台湾居民居住证填写有误(18位)!";
            } else {
                if (!idno.substring(0, 6).equals("830000") || !idno.substring(6, 14).equals(birthDay.replace("-", "")) || !idno.substring(14, 18).matches("[0-9A-Za-z]{4}")) {
                    errorMsg += "台湾居民居住证填写有误(830000+8位出生日期+4位数字或字母)!";
                }
            }
        }
        return errorMsg;
    }



2、校验身份证有效期是否合规

    //校验证件有效期
    public static String checkIdtypeEndDate(Integer age, String idType, String idTypeEndDate, String birthDay) {
        if (age == null || StringUtils.isBlank(idType)) {
            return "校验证件有效期失败:参数有误!";
        }
        if (!DateTimeUtil.checkFutureDate(idTypeEndDate)) {
            return "证件有效期填写有误,不得小于当天日期!";
        }
        if (!DateTimeUtil.checkDate(idTypeEndDate, "9999-12-31")) {
            System.out.println("证件有效期填写有误,不得大于9999-12-31(即长期)!");
        }
        try {
            if (idType.equals("0")) {
                if (age < 16 && !DateTimeUtil.checkDate(idTypeEndDate, DateTimeUtil.getAppointDate(new Date(), 5, 1))) {
                    return "由于当前年龄为16周岁(不含)以下且证件类型为“0-身份证”时,则证件有效期不得超过业务办理日期+5年!";
                }
                if (age >= 16 && age <= 25 && !DateTimeUtil.checkDate(idTypeEndDate, DateTimeUtil.getAppointDate(new Date(), 10, 1))) {
                    return "由于当前年龄为16周岁(含)-25周岁(含)且证件类型为“0-身份证”时,则证件有效期不得超过“业务办理日期+10年!";
                }
                if (age >= 26 && age <= 45 && !DateTimeUtil.checkDate(idTypeEndDate, DateTimeUtil.getAppointDate(new Date(), 20, 1))) {
                    return "由于当前年龄为26周岁(含)-45周岁(含)且证件类型为“0-身份证”时,则证件有效期不得超过“业务办理日期+20年!";
                }
            }
            if (idType.matches("^[167ef]+$") && idTypeEndDate.equals("9999-12-31")) {
                return "证件有效期不得选择'长期'!";
            }

            //add by liuhaochen 暂无两种情况
            if (idType.equals("10") && !idTypeEndDate.equals(DateTimeUtil.getAppointDate(new SimpleDateFormat("yyyy-MM-dd").parse(birthDay), 2, 1))) {
                return "证件类型为“出生证”时,则证件有效期默认“客户出生日期+2年”且不允许修改;";
            }
            if (idType.equals("11") && !idTypeEndDate.equals(DateTimeUtil.getAppointDate(new SimpleDateFormat("yyyy-MM-dd").parse(birthDay), 16, 1))) {
                return "证件类型为“户口本”时,则证件有效期默认“客户出生日期+16年”且不允许修改。";
            }
        } catch (ParseException e) {
            return "校验证件有效期失败!";
        }
        return "";
    }

3、校验手机号

    /**
     * 校验手机号
     * @param phone
     * @return
     */
    public static boolean checkMobilePhone(String phone) {
        String regex = "^[1]\\d{10}$";
        if (StringUtil.isEmpty(phone) || phone.length() != 11) {
            return false;
        } else {
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(phone);
            return m.matches();
        }
    }

4、银行卡校验

    /**
     * 银行卡校验
     * @param cardNo
     * @return
     */
    public static boolean checkBankCard(String cardNo) {
        try {
            int[] cardNoArr = new int[cardNo.length()];
            for (int i = 0; i < cardNo.length(); i++) {
                cardNoArr[i] = Integer.valueOf(String.valueOf(cardNo.charAt(i)));
            }
            for (int i = cardNoArr.length - 2; i >= 0; i -= 2) {
                cardNoArr[i] <<= 1;
                cardNoArr[i] = cardNoArr[i] / 10 + cardNoArr[i] % 10;
            }
            int sum = 0;
            for (int i = 0; i < cardNoArr.length; i++) {
                sum += cardNoArr[i];
            }
            return sum % 10 == 0;
        } catch (Exception e) {
            return false;
        }
    }

5、校验中文姓名

    /**
     * 校验中文姓名
     *
     * 中文姓名仅限:全角汉字(例如:李明)、全角点号“·”(例如:阿凡提·莫汉莫德)、全角点号“.”(例如:阿拉汉.西提木)。
     * @param params
     * @return
     */
    public static String checkChineseName(String params) {
        if (StringUtils.isNotBlank(params) && StringUtils.isNotBlank(params.trim())) {
            // Pattern CHINESENAME_PATTERN = Pattern.compile("^[\u4e00-\u9fa5.·]{0,}$");
            // Pattern CHINESENAME_PATTERN = Pattern.compile("^[u2E80-uFE4F.·]{0,}$");
            Pattern CHINESENAME_PATTERN = Pattern.compile("^[\u2E80-\uFE4F.·]{1,}+$");
            Matcher m = CHINESENAME_PATTERN.matcher(params.trim());//params.trim()   去除字符串两端的空格
            if (!m.matches()) {
                return params + "中文姓名仅限:全角汉字、全角点号“·”、全角点号“.”";
            }
//            利用String.replaceAll()将所有的汉字替换成空字符,利用其与原字符串的长度差得到汉字的个数。
            String regex = "[\u2E80-\uFE4F]";
            if (params.length() - params.replaceAll(regex, "").length() < 2) {
                return "中文姓名长度至少为两个汉字";
            }
            return checkFirstChinese(params);
        }
        return "";
    }

6、校验英文姓名

    /**
     * 校验英文姓名
     *
     * 中文姓名仅限:半角英文、半角点号“.”(例如:Jenny.Kitty)、半角空格号(例如:Jenny Kitty)、半角点号“-” (例如:Jenny-Kitty)。
     * @param params
     * @return
     */
    public static String checkEnglishName(String params) {
        if (StringUtils.isNotBlank(params) && StringUtils.isNotBlank(params.trim())) {
            Pattern CHINESENAME_PATTERN = Pattern.compile("^[a-zA-Z .-]{0,}$");
            String s = params.replaceAll(" +", " ");
            String trim = s.trim();
            Matcher m = CHINESENAME_PATTERN.matcher(trim);//params.trim()   去除字符串两端的空格
            if (!m.matches()) {
                return "英文姓名仅限:半角英文、半角点号“.”、半角空格号、半角点号“-”";
            }
            String regex = "[a-zA-Z]";
            if (trim.length() - trim.replaceAll(regex, "").length() < 4) {
                return "英文姓名长度至少4个字母";
            }
            return checkFirstEnglish(trim);
        }
        return "";
    }

7、校验固定电话

    /**
     * 校验固定电话
     *
     *  只能录入“-”、“(”、“)”、“+”、数字,如果录入其他字符,需阻断提示   有传值才校验,没传值无需校验
     * @param params
     * @return
     */
    public static String checkTel(String params) {
        if (StringUtils.isNotBlank(params) && StringUtils.isNotBlank(params.trim())) {
            //String pattern = "[0-9-()+]{7,18}";
            //String pattern = "[0-9-()+]{1,18}";
            String pattern = "^\\d{3}-\\d{7,8}|\\d{4}-\\d{7,8}$";
            Pattern r = Pattern.compile(pattern);
            Matcher m = r.matcher(params.trim());//params.trim()   去除字符串两端的空格
            if (!m.matches()) {
                return "固定电话格式应为:3位或4位区号-7位或8位电话号码";
            }
            return checkRepeat(params);
        }
        return "";
    }

8、校验是否包含汉字

    /*
     * 判断是否存在汉字
     * @param countname
     * @return
     */
    public static boolean checkcountname(String countname) {
        Pattern p = Pattern.compile("[\u2E80-\uFE4F]");
        Matcher m = p.matcher(countname);
        if (m.find()) {
            return true;
        }
        return false;
    }

9、校验电子邮箱

/**
     * 校验电子邮箱
     * 
     * @param email
     * @return
     */
    public static boolean checkEmail(String email) {
        return email.matches("^([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$");
    }

10、校验企业证件类型和证件号

    /**
     * 校验企业证件类型和证件号,新的校验规则
     *
     * @param grpIdType
     * @param grpIdNo
     */
    public static String checkGrpTypeAndGrpIdNo1(String grpIdType, String grpIdNo) {
        // 证件号
        if (grpIdNo.length() < 3) {
            return "企业证件号有误!";
        }
        switch (grpIdType) {
            // 统一社会信用代码
            case "1":
                // 1、统一社会信用代码长度应为18位
                if (grpIdNo.length() != 18) {
                    return "统一社会信用代码长度应为18位!";
                }
                // 2、增加核心的校验规则
                if (!grpIdNo.matches("^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$")) {
                    return "统一社会信用代码有误,请检查!";
                }
                // 3、统一社会信用代码的前两位应为"11,12,13,19,21,29,31,32,33,34,35,39,41,49,51,52,53,59,61,62,69,71,72,79,81,89,91,92,93,A1,A9,N1,N2,N3,N9,Y1,54,55,37,G1"中的一个
                String substring = grpIdNo.substring(0, 2);
                List stringList = Arrays.asList(new String[] { "11", "12", "13", "19", "21", "29", "31", "32", "33",
                        "34", "35", "39", "41", "49", "51", "52", "53", "59", "61", "62", "69", "71", "72", "79", "81",
                        "89", "91", "92", "93", "A1", "A9", "N1", "N2", "N3", "N9", "Y1", "54", "55", "37", "G1" });
                if (!stringList.contains(substring)) {
                    return "统一社会信用代码格式有误,前两位不符合要求!";
                }
                // 4、统一社会信用代码的第3-8位对应《业务代码表》中的"县及县以上行政区划代码"
                String substring1 = grpIdNo.substring(2, 8);
                FDCodeMapper fdCodeMapper = SpringContextUtil.getBean(FDCodeMapper.class);
                int count = fdCodeMapper.selectSingleInfoByCountyCode(substring1);
                if (count == 0) {
                    return "统一社会信用代码格式有误,3-8位不符合要求!";
                }

                break;
            // 组织结构代码证,由8位数字加上一位校验码(数字或大写字母)组成
            case "2":
                if (!grpIdNo.matches("^[0-9A-Za-z]{9}$")) {
                    return "组织机构代码证号码有误,请检查!";
                }
                break;
            // 税务登记证
            case "3":
                if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
                    return "税务登记证号码有误,请检查!";
                }
                break;
            // 营业执照
            case "4":
                if (grpIdNo.length() == 15) {
                    return "营业执照证件号码有误,请检查!";
                } else if (grpIdNo.length() == 18) {
                    if (!grpIdNo.matches("^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$")) {
                        return "营业执照证件号码有误,请检查!";
                    }
                    List stringList1 = Arrays
                            .asList(new String[] { "11", "12", "13", "19", "21", "29", "31", "32", "33", "34", "35", "39",
                                    "41", "49", "51", "52", "53", "59", "61", "62", "69", "71", "72", "79", "81", "89",
                                    "91", "92", "93", "A1", "A9", "N1", "N2", "N3", "N9", "Y1", "54", "55", "37", "G1" });
                    if (!stringList1.contains(grpIdNo.substring(0, 2))) {
                        return "营业执照证件号码有误,请检查!";
                    }
                    String substring2 = grpIdNo.substring(2, 8);
                    FDCodeMapper fdCodeMapper1 = SpringContextUtil.getBean(FDCodeMapper.class);
                    int count1 = fdCodeMapper1.selectSingleInfoByCountyCode(substring2);
                    if (count1 == 0) {
                        return "营业执照证件号码有误,请检查!";
                    }
                } else {
                    return "营销执照证件号格式有误!";
                }
                break;
            // 事业单位法人证书,由任意16位字符组成
            case "5":
                if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
                    return "事业单位法人证书号码有误,请检查!";
                }
                break;
            // 社会团体法人证书,由任意16位字符组成
            case "6":
                if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
                    return "社会团体法人证书号码有误,请检查!";
                }
                break;
            // 民办非企业单位登记证书,由16位字母数字组成
            case "7":
                if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
                    return "民办非企业单位登记证书号码有误,请检查!";
                }
                break;
            // 基金会法人登记证书,由16位字母数字组成
            case "8":
                if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
                    return "基金会法人登记证书号码有误,请检查!";
                }
                break;
            // 工商注册号码,由6位首次登记机关码,8位顺序码,1位校验码组成
            case "9":
                if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
                    return "工商注册号码有误,请检查!";
                }
                break;
            // 其他证件
            case "10":
                if (!grpIdNo.matches("^[0-9A-Za-z]{3,50}$")) {
                    return "其他证件号码有误,请检查!";
                }
                break;
            default:
                return "企业证件类型不存在!";
        }
        return null;
    }

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