1 前端传参要求
项目开发中经常会遇到对用户输入内容的限制,本篇对常用限制做一总结。如下图所示,标识字段有严格命名限制,用户输入校验这部分工作前端可以做,当然后端也可以通过在DTO中添加注解的方式实现参数校验。其底层原理还是拦截器拦截请求,对带有相关注解的属性字段进行处理(非空、大小、长度、内容等判断)
DTO中代码如下:
@Data
public class ProjectDTO {
@NotBlank(message = "项目名不能为空")
private String name;
private String desc;
@NotBlank(message = "项目标识符不得为空")
@Pattern(regexp = "[a-z0-9_\\-]{1,100}", message = "仅小写字母(a-z)、数字、破折号(-)和下划线(_)可以使用,且长度最长为100,最短为1")
private String identifier;
private boolean isPublic;
/***
* 移动号段: 134 135 136 137 138 139 147 148 150 151 152 157 158 159 165 172 178 182 183 184 187 188 198
* 联通号段: 130 131 132 145 146 155 156 166 170 171 175 176 185 186
* 电信号段: 133 149 153 170 173 174 177 180 181 189 191 199
* 虚拟运营商: 170
*/
@Pattern(regexp = "^((13[0-9])|(14[5,6,7,9])|(15[^4])|(16[5,6])|(17[0-9])|(18[0-9])|(19[1,8,9]))\\d{8}$", message = "invalid phone number")
private String phone;
}
有时系统对用户名的命名有诸多要求,比如用户名必须要有一个小写字母,一个大写字母和一个数字,并且是6-20位,正则表达式如下:
@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[A-Za-z0-9]{6,20}$", message = "用户名错误")
2 其他常用表达式
2.1 数字校验
整数或者小数:"^[0-9]+\.{0,1}[0-9]{0,2}$"
只能输入数字:"^[0-9]*$"
只能输入n位的数字:"^\d{n}$"
只能输入至少n位的数字:"^\d{n,}$"
只能输入m~n位的数字:"^\d{m,n}$"
只能输入零和非零开头的数字:"^(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.2 字符串校验
只能输入长度为3的字符:"^.{3}$"。
只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"
只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"
只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"
只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"
只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"
2.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"。
2.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_-]+)+$"
2.5 汉字校验
只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"
匹配中文字符的正则表达式:"[\u4e00-\u9fa5]"
2.6 URL校验
未校验汉字
验证URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"or
"(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]"
2.7 固定电话校验
电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"
//格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。