1. 程式人生 > 其它 >正則校驗工具類

正則校驗工具類

/**
 * @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();
    }
}