正则校验工具类


/**
 * @Author: DengJia
 * @Date: 2022/5/10
 * @Description: 正则校验工具类
 */

public class RegexUtil {
    /**
     * 移动手机号
     */
    private static final Pattern MOBILE_RE = Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$");
    /**
     * 带区号的电话
     */
    private static final Pattern PHONE_WITH_AREA_CODE_RE = Pattern.compile("^[0][1-9]{2,3}-[0-9]{5,10}$");
    /**
     * 不带区号的电话
     */
    private static final Pattern PHONE_WITHOUT_AREA_CODE_RE = Pattern.compile("^[1-9]{1}[0-9]{5,8}$");
    /**
     * 邮箱格式正则表达式
     */
    private static final Pattern EMAIL_RE = Pattern.compile("^\\w+@(\\w+\\.)+\\w+$");

    /**
     * 身份证
     */
    private static final Pattern ID_CARD_RE = Pattern.compile("^\\d{15}|\\d{17}[\\dxX]$");

    /**
     * 校验联系(手机、电话)号码是否合法
     *
     * @param number 号码
     */
    public static void validatePhoneNumber(String number) {
        if (!(isPhone(number) || isMobile(number))) {
            throw new RuntimeException("号码校验失败,请输入合法格式!");
        }
    }

    /**
     * 校验电子邮箱是否合法
     *
     * @param email 电子邮箱
     */
    public static void validateEmail(String email) {
        if (!email.matches(EMAIL_RE.pattern())) {
            throw new RuntimeException("邮箱校验失败,请输入合法格式!");
        }
    }

    /**
     * 校验身份证是否合法
     *
     * @param idCard 身份证
     */
    public static void validateIdCard(String idCard) {
        if (!idCard.matches(ID_CARD_RE.pattern())) {
            throw new RuntimeException("身份证校验失败,请输入合法格式!");
        }
    }

    /**
     * 校验身份证与入参年龄、性别是否符合
     *
     * @param idCard 身份证
     * @param age    年龄
     * @param gender 性别 1男 2女
     */
    public static void validatePersonalInfo(String idCard, Integer age, Integer gender) {
        validateIdCard(idCard);

        // 校验年龄
        if (age != null) {
            Calendar cal = Calendar.getInstance();
            int nowYear = cal.get(Calendar.YEAR), nowMonth = cal.get(Calendar.MONTH) + 1, nowDay = cal.get(Calendar.DATE), year = Integer.parseInt(idCard.substring(6, 10)), month = Integer.parseInt(idCard.substring(10, 12)), day = Integer.parseInt(idCard.substring(12, 14));

            int realAge;
            boolean reach = (month < nowMonth) || (month == nowMonth && day <= nowDay);
            if (reach) {
                realAge = nowYear - year;
            } else {
                realAge = nowYear - year - 1;
            }

            if (!Objects.equals(age, realAge)) {
                throw new RuntimeException("年龄与身份证不符,请检查!");
            }
        }

        // 校验性别
        if (gender != null) {
            int flag = new Integer(idCard.substring(16, 17)) % 2;
            boolean match = flag == 1 ? 1 == gender : 2 == gender;
            if (!match) {
                throw new RuntimeException("性别与身份证不符,请检查!");
            }
        }
    }

    public static void validatePersonalInfo(String idCard, String age, String gender) {
        validatePersonalInfo(idCard, Integer.parseInt(age), Integer.parseInt(gender));
    }

    private static boolean isMobile(final String number) {
        // 手机号验证
        Matcher matcher = MOBILE_RE.matcher(number);
        return matcher.matches();
    }

    private static boolean isPhone(final String number) {
        // 电话号码验证
        Matcher matcher;
        if (number.length() > 9) {
            matcher = PHONE_WITH_AREA_CODE_RE.matcher(number);
        } else {
            matcher = PHONE_WITHOUT_AREA_CODE_RE.matcher(number);
        }
        return matcher.matches();
    }
}