java中邮箱校验推荐正则"^[a-za-z0-9._%+-]+@[a-za-z0-9.-]+.[a-za-z]{2,}$",手机号推荐"^1[3-9]\d{9}$";需配合@notblank/@notnull,注意转义和^$边界符。

Java 中用 @Pattern 校验邮箱和手机号,核心是写对正则表达式,并注意注解的适用场景和常见坑点。
邮箱校验:用标准但不过于严苛的正则
RFC 5322 规范的邮箱正则太复杂,实际项目推荐兼顾可读性与覆盖主流格式(如 user@example.com、test.name@sub.domain.co.uk)的简化版本:
- 推荐正则:
"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" - 关键说明:
-
[a-zA-Z0-9._%+-]+匹配用户名部分,允许字母、数字及常见符号(.、_、%、+、-) -
@字面量 -
[a-zA-Z0-9.-]+匹配域名主体,允许字母、数字、点、短横线 -
\.转义点号,表示必须有“.”分隔域名和后缀 -
[a-zA-Z]{2,}保证顶级域至少两个字母(如com、org、io),不匹配单字母或纯数字后缀
-
- 使用示例:
public class User { @Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", message = "邮箱格式不正确") private String email; }
手机号校验:按国内场景定制,别盲目套国际正则
中国手机号有明确规则(11位、以 1 开头、第二位为 3–9),应优先匹配真实号码段,避免用过于宽泛的 ^1[0-9]{10}$(会误通过已停用号段):
- 推荐正则(覆盖主流号段):
"^1[3-9]\d{9}$" - 说明:
-
^1必须以 1 开头 -
[3-9]第二位为 3 到 9(排除 10、11、12 等无效号段) -
\d{9}后接 9 位数字,总长 11 位
-
- 如需更严格(例如排除虚拟运营商早期号段或预留号段),可扩展为:
"^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$",但日常校验用^1[3-9]\d{9}$足够且可维护 - 使用示例:
public class User { @Pattern(regexp = "^1[3-9]\d{9}$", message = "手机号格式不正确") private String phone; }
注意事项:@Pattern 不是万能,搭配使用更可靠
@Pattern 是 Bean Validation 注解,只在校验触发时生效(如 Spring MVC 的 @Valid 参数、Hibernate Validator 手动调用),它本身不做类型转换或空值处理:
- 必须配合
@NotBlank或@NotNull,否则空字符串或 null 会绕过正则匹配(@Pattern对 null 默认跳过) - 正则中的
^和$很重要,漏写会导致部分匹配(如"123@abc"会被"\w+@\w+\.\w+"错误通过) - Java 字符串中反斜杠要双写(
"\."表示一个点),IDE 通常会提示;若用Pattern.compile()手动校验,只需单反斜杠 - 前端仍需做相同逻辑校验,后端
@Pattern是兜底,不是唯一防线
替代方案:更语义化的自定义注解(进阶)
如果项目中邮箱/手机号校验频繁出现,建议封装成自定义注解(如 @ValidEmail、@ValidPhone),内部复用统一正则和错误信息,提升可读性和一致性:
- 好处:字段上写
@ValidPhone比一长串正则清晰;升级规则时只需改一处 - 实现方式:继承
ConstraintValidator,重写isValid()方法,注入正则逻辑 - 不强制要求,小项目直接用
@Pattern完全可行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











