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