@pattern 是 jsr 303/380 中用于字符串正则校验的注解,需作用于 string 类型字段,regexp 指定正则(注意 java 反斜杠双写、建议显式锚定 ^$),空字符串默认通过,null 默认跳过,常配合分组与 @validated 使用。

@Pattern 是 Java Bean Validation(JSR 303/380)规范中用于正则表达式校验的注解,常用于对字符串字段进行格式约束,比如手机号、邮箱、身份证号、密码强度等。它通过 regexp 属性指定正则表达式,并可选配 message 自定义错误提示。
基本用法:声明正则并绑定字段
在实体类字段上直接使用 @Pattern,需确保该字段类型为 String(其他类型会抛出运行时异常):
public class User {
@Pattern(regexp = "^1[3-9]\d{9}$", message = "手机号格式不正确")
private String phone;
@Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", message = "邮箱格式无效")
private String email;
}
关键细节:正则写法与注意事项
- Java 字符串中反斜杠
需双写,如匹配点号要写\.,匹配数字写\d - 正则默认**不自动锚定**,建议显式加上
^(开头)和$(结尾),避免部分匹配(例如"abc123"被"\d+"错误通过) - 空字符串
""默认通过校验(除非加@NotBlank或@NotEmpty) - 若允许 null,
@Pattern默认跳过校验;如需 null 也触发,可加nullable = false(部分实现支持,但非标准属性,不推荐依赖)
常见场景正则示例
-
6–20位字母数字下划线密码:
^[a-zA-Z0-9_]{6,20}$ -
18位身份证号(简化版):
^[1-9]\d{17}[\dXx]$(注意末位可能是 X/x) -
带协议的 URL:
^https?://[\w.-]+(?:/[\w.-]*)*$ -
中文、英文、数字、短横线、下划线(昵称):
^[\u4e00-\u9fa5a-zA-Z0-9_-]{2,16}$
配合验证分组与手动触发
若只在特定场景校验(如注册时不校验 ID),可用验证分组:
public interface RegisterGroup {}
public class User {
@Pattern(regexp = "...", groups = RegisterGroup.class)
private String inviteCode;
}
// 手动触发
Set<constraintviolation>> violations = validator.validate(user, RegisterGroup.class);
</constraintviolation>
也可在 Controller 中用 @Validated 指定分组,Spring 会自动拦截并返回 400 错误。











