前言
项目开发中经常会遇到对用户输入内容的限制和校验,标识字段有严格命名限制,用户输入校验这部分工作前端可以做,当然后端也可以通过在实体类中添加注解的方式实现参数校验。其底层原理还是拦截器拦截请求,对带有相关注解的属性字段进行处理(非空、大小、长度、内容等判断和校验)。
import jakarta.validation.constraints.Pattern;
/**
* 用户名称
*/
@Pattern(regexp="^[\u4e00-\u9fa5_a-zA-Z0-9]+$",message="用户名称只能输入中文字符 字母、数字")
@ApiModelProperty(value = "用户名称")
private String name;
有时系统对用户名的命名有更多要求,比如用户名必须要有一个小写字母,一个大写字母和一个数字,并且是6-20位
@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[A-Za-z0-9]{6,20}$", message = "用户名错误")
其他常用正则表达式
1.数字内容校验
整数或者小数:
"^[0-9]+\.{0,1}[0-9]{0,2}$"
只允许输入数字:"^[0-9]*$"
只允许输入零和非零开头的数字:
"^(0|[1-9][0-9]*)$"
只允许输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"
只允许输入有1
~
3
位小数的正实数:
"^[0-9]+(.[0-9]{1,3})?$"
只允许输入非零的正整数:"^\+?[1-9][0-9]*$"
只允许输入非零的负整数:"^^-[1-9]+[0-9]*$"
2.字符串校验
只允许输入长度为3
的字符:
"^.{3}$"
只允许输入由26
个英文字母组成的字符串:
"^[A-Za-z]+$"
只允许输入由26
个大写英文字母组成的字符串:
"^[A-Z]+$"
只允许输入由26
个小写英文字母组成的字符串:
"^[a-z]+$"
只允许输入由数字和26
个英文字母组成的字符串:
"^[A-Za-z0-9]+$"
只允许输入由数字、26
个英文字母或者下划线组成的字符串:
"^\w+$"
3.
月份时间校验
验证一年的12个月:"^(0?[1-9]|1[0-2])$" //格式为:"01"~"09"和"1"~"12"。
验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$" //格式为;"01"~"09"和"1"~"31"。
4.Email校验
由于各种域名邮箱的多样性,需要特殊情况特殊对待,限制可以做的严格也可以宽松
举例:zhangsan_123
@cetc
.com.cn
字母和数字表示为A-Za-z0-
9;下划线表示为_;中划线表示为-
由于名称是由若干个字母、数字、下划线和中划线组成,所以需要用到+表示多次出现
通过分析得出邮件名称部分表达式为[a-zA-Z0-9_-]+
一般域名的规律为“[N级域名][三级域名.]二级域名.顶级域名”,比如
"qq.com"
、
"www.qq.com"
、
"mp.weixin.qq.com"
、
"12-34.com.cn"
,分析可得域名类似
"** .** .** .**"
组成。
"**"
部分可以表示为[a-zA-Z0-9_-]+
".**"
部分可以表示为\.[a-zA-Z0-9_-]+
多个
".**"
可以表示为(\.[a-zA-Z0-9_-]+)+
综上所述,域名部分可以表示为[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+
我们用@符号将邮箱的名称和域名拼接起来,因此完整的邮箱表达式为
^[A-Za-z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
验证Email:
"^[A-Za-z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$"
5.汉字校验
只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"
匹配中文字符的正则表达式:"[\u4e00-\u9fa5]"
6.联系电话校验
联系电话:@Pattern(regexp = "^[\\d\\*]{7,12}$", message = "联系电话输入有误")
由于区号分为3位和四位的,然后座机号码又分为7位和8位的,所以这里校验的长度是7-12位,并且这里添加了*表示脱敏的手机号仍然可以通过校验。
7. 密码校验
密码:长度为6-32位,并且必须包含数字、字母、特殊符号中的至少两种:
@Pattern(regexp = "^(?=.*[a-zA-Z0-9].*)(?=.*[a-zA-Z.!@#$%^&*].*)(?=.*[0-9.!@#$%^&*].*).{6,32}$", message = "密码至少包含数字,字母和符号的两种")