Java常用正则表达式(身份证号、邮箱、手机号)格式校验
目录
身份证号的正则表达式
代码解释
正则表达式
方法 isValidIDCard
注意事项
校验邮箱的正则表达式
代码解释
正则表达式
方法 isValidEmail
注意事项
手机号的正则表达式
中国大陆手机号校验(支持空字符串)
代码解释
通用手机号校验(支持空字符串)
代码解释
注意事项
身份证号的正则表达式
若要在 Java 里使用正则表达式校验身份证号,同时允许输入为空字符串,可在原有的身份证号校验正则表达式基础上,增加对空字符串的匹配。以下是示例代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class IDCardValidatorWithEmpty {
// 定义支持空字符串的身份证号校验的正则表达式
private static final String ID_CARD_REGEX = "^$|(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)";
private static final Pattern ID_CARD_PATTERN = Pattern.compile(ID_CARD_REGEX);
/**
* 校验身份证号的方法,允许空字符串
* @param idCard 待校验的身份证号
* @return 如果身份证号格式正确或者为空字符串返回 true,否则返回 false
*/
public static boolean isValidIDCard(String idCard) {
Matcher matcher = ID_CARD_PATTERN.matcher(idCard);
return matcher.matches();
}
public static void main(String[] args) {
// 测试用的 15 位身份证号
String idCard15 = "110105880620517";
// 测试用的 18 位身份证号
String idCard18 = "11010519880620517X";
// 无效的身份证号
String invalidIdCard = "123456789012345678";
// 空字符串
String emptyIdCard = "";
// 调用校验方法并输出结果
System.out.println(idCard15 + " 是否为有效的身份证号: " + isValidIDCard(idCard15));
System.out.println(idCard18 + " 是否为有效的身份证号: " + isValidIDCard(idCard18));
System.out.println(invalidIdCard + " 是否为有效的身份证号: " + isValidIDCard(invalidIdCard));
System.out.println("空字符串是否允许: " + isValidIDCard(emptyIdCard));
}
}
代码解释
正则表达式
^$|(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)
^$
:用于匹配空字符串,^
代表字符串起始位置,$
代表字符串结束位置,二者结合就表示空字符串。|
:这是逻辑或运算符,用于分隔不同的匹配规则。(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)
:此部分用于匹配 15 位身份证号,详细解释如下:[1-9]\\d{7}
:身份证号前 8 位,首位不能为 0。((0\\d)|(1[0-2]))
:表示月份,范围是 01 - 12。(([0|1|2]\\d)|3[0-1])
:表示日期,范围是 01 - 31。\\d{3}
:最后 3 位顺序码。
(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)
:用于匹配 18 位身份证号,具体解释如下:[1-9]\\d{5}
:前 6 位地区代码,首位不能为 0。[1-9]\\d{3}
:接下来 4 位年份,首位不能为 0。((0\\d)|(1[0-2]))
和(([0|1|2]\\d)|3[0-1])
:分别表示月份和日期。((\\d{4})|\\d{3}[Xx])
:最后 4 位,可能是 4 位数字或者前 3 位数字加最后一位X
或x
。
方法 isValidIDCard
该方法借助 Matcher
对象来检查输入的字符串是否与正则表达式匹配,若匹配则返回 true
,反之返回 false
。
注意事项
- 此正则表达式只能校验身份证号的格式是否正确,无法验证其真实性和有效性。
- 对于闰年 2 月日期范围等特殊情况,正则表达式无法进行精确校验,若需要更严格的验证,可能要结合其他逻辑。
校验邮箱的正则表达式
在 Java 中,若要校验邮箱且允许空字符串,可以在原本用于校验邮箱格式的正则表达式基础上添加对空字符串的匹配规则。以下是示例代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EmailValidatorWithEmpty {
// 定义支持空字符串的邮箱校验正则表达式
private static final String EMAIL_REGEX = "^$|^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX);
/**
* 校验邮箱的方法,允许空字符串
* @param email 待校验的邮箱地址
* @return 如果邮箱格式正确或者为空字符串返回 true,否则返回 false
*/
public static boolean isValidEmail(String email) {
Matcher matcher = EMAIL_PATTERN.matcher(email);
return matcher.matches();
}
public static void main(String[] args) {
// 有效邮箱
String validEmail = "example@example.com";
// 无效邮箱
String invalidEmail = "example.example.com";
// 空字符串
String emptyEmail = "";
System.out.println(validEmail + " 是否为有效的邮箱地址: " + isValidEmail(validEmail));
System.out.println(invalidEmail + " 是否为有效的邮箱地址: " + isValidEmail(invalidEmail));
System.out.println("空字符串是否允许: " + isValidEmail(emptyEmail));
}
}
代码解释
正则表达式
^$|^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$
^$
:用于匹配空字符串。^
表示字符串的起始位置,$
表示字符串的结束位置,二者组合起来就表示一个空的字符串。|
:逻辑或运算符,用于分隔不同的匹配规则。^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$
:用于匹配正常的邮箱格式,具体解释如下:^
:表示字符串的开始。[a-zA-Z0-9_+&*-]+
:匹配邮箱用户名的开头部分,允许包含字母、数字、下划线、加号、连字符、星号和与号。(?:\\.[a-zA-Z0-9_+&*-]+)*
:匹配用户名中可能出现的点号及其后面的字符,(?: ... )
是一个非捕获组,*
表示前面的部分可以出现 0 次或多次。@
:匹配邮箱地址中的@
符号。(?:[a-zA-Z0-9-]+\\.)+
:匹配域名部分,允许包含字母、数字和连字符,并且可以有多个子域名,每个子域名后面跟着一个点号。[a-zA-Z]{2,7}
:匹配顶级域名,顶级域名由 2 到 7 个字母组成。$
:表示字符串的结束。
方法 isValidEmail
该方法通过 Matcher
对象检查输入的字符串是否与正则表达式匹配,如果匹配则返回 true
,否则返回 false
。
注意事项
- 此正则表达式虽然能校验邮箱的基本格式,但不能保证邮箱地址是真实存在且可使用的。
- 对于一些特殊的邮箱地址,如带有国际化域名的邮箱,可能需要更复杂的正则表达式来进行准确校验。
手机号的正则表达式
以下为你提供针对中国大陆手机号和通用手机号的校验正则表达式,同时支持空字符串校验的 Java 代码示例。
中国大陆手机号校验(支持空字符串)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChinesePhoneValidatorWithEmpty {
// 定义支持空字符串的中国大陆手机号校验正则表达式
private static final String PHONE_REGEX = "^$|^1[3-9]\\d{9}$";
private static final Pattern PHONE_PATTERN = Pattern.compile(PHONE_REGEX);
/**
* 校验中国大陆手机号的方法,允许空字符串
* @param phone 待校验的手机号
* @return 如果手机号格式正确或者为空字符串返回 true,否则返回 false
*/
public static boolean isValidChinesePhone(String phone) {
Matcher matcher = PHONE_PATTERN.matcher(phone);
return matcher.matches();
}
public static void main(String[] args) {
// 有效手机号
String validPhone = "13800138000";
// 无效手机号
String invalidPhone = "23800138000";
// 空字符串
String emptyPhone = "";
System.out.println(validPhone + " 是否为有效的中国大陆手机号: " + isValidChinesePhone(validPhone));
System.out.println(invalidPhone + " 是否为有效的中国大陆手机号: " + isValidChinesePhone(invalidPhone));
System.out.println("空字符串是否允许: " + isValidChinesePhone(emptyPhone));
}
}
代码解释
- 正则表达式
^$|^1[3-9]\\d{9}$
:^$
:用于匹配空字符串,^
表示字符串开始,$
表示字符串结束,两者结合即匹配空内容。|
:逻辑或运算符,分隔不同匹配规则。^1[3-9]\\d{9}$
:用于匹配中国大陆 11 位手机号,手机号以 1 开头,第二位是 3 - 9 中的一个数字,后面跟着 9 位数字。
通用手机号校验(支持空字符串)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GeneralPhoneValidatorWithEmpty {
// 定义支持空字符串的通用手机号校验正则表达式
private static final String GENERAL_PHONE_REGEX = "^$|^\\+?[1-9]\\d{1,14}$";
private static final Pattern GENERAL_PHONE_PATTERN = Pattern.compile(GENERAL_PHONE_REGEX);
/**
* 校验通用手机号的方法,允许空字符串
* @param phone 待校验的手机号
* @return 如果手机号格式正确或者为空字符串返回 true,否则返回 false
*/
public static boolean isValidGeneralPhone(String phone) {
Matcher matcher = GENERAL_PHONE_PATTERN.matcher(phone);
return matcher.matches();
}
public static void main(String[] args) {
// 有效通用手机号
String validGeneralPhone = "+8613800138000";
// 无效通用手机号
String invalidGeneralPhone = "+0123456789";
// 空字符串
String emptyGeneralPhone = "";
System.out.println(validGeneralPhone + " 是否为有效的通用手机号: " + isValidGeneralPhone(validGeneralPhone));
System.out.println(invalidGeneralPhone + " 是否为有效的通用手机号: " + isValidGeneralPhone(invalidGeneralPhone));
System.out.println("空字符串是否允许: " + isValidGeneralPhone(emptyGeneralPhone));
}
}
代码解释
- 正则表达式
^$|^\\+?[1-9]\\d{1,14}$
:^$
:匹配空字符串。|
:逻辑或运算符。^\\+?[1-9]\\d{1,14}$
:用于匹配通用手机号,\\+?
表示国家码前的+
号可有可无,[1-9]
表示手机号第一位不能为 0,\\d{1,14}
表示后面可跟 1 到 14 个数字,满足国际电信联盟规定的最长 15 位手机号(含国家码)。
注意事项
- 正则表达式只能校验手机号格式,不能判断手机号是否真实可用。
- 手机号规则可能随时间和运营商调整,需根据实际情况更新正则表达式。