springboot-@Validated参数校验@Pattern利⽤正则⾃定义注解
⽂章⽬录
⼀、validation–参数校验
JSR-303 是 JAVA EE 6 中的⼀项⼦规范,叫做 Bean Validation,⽤于对 Java Bean 中的字段的值进⾏验证。Hibernate Validator则是Hibdernate提供的⼀种对该规范的实现。
——即Hibernate Validator是⽤来做参数校验。
Hibernate Validator:是JSR-303参考实现。
Constranit desc
@Null 被注解的元索必须为空
@notNull 被注解的元素必须不为空
@Min 被注解的元素必须是数字且必须⼩于等于指定值
@Max 被注解的元素必须是数字且必须⼤于等于指定值
@Past 被注解的元索必须是- -个过去的⽇期
@Future 被注解的元素必须是⼀个将来的⽇期
regex匹配@Pattern 被注解的元素必须符合给定的正则表达式
@AssertTure 被注解的元素必须为ture
@AssertFalse 被注解的元素必须为false
附加注解:
Constranit desc
@Email 被注解的元素必须是email地址
@Length 被注解的元素必须在指定的范围内
@NotEmpty 被注解的元素是必须
@Range 被注解的元素可以是数字或者是数字的字符串必须在指定的范围内
@URL 被注解的元素必须是⼀个URL
demo
@Max(value =2,message ="登录类型只能是1或2")
@Min(value =1,message ="登录类型只能是1或2")
@NotNull(message ="登录类型不能为空")
private Integer type;
⾮空判断
@NotNull:不能为null,但可以为empty
@NotEmpty:不能为null,⽽且长度必须⼤于0
@NotBlank:只能作⽤在String上,不能为null,⽽且调⽤trim()后,长度必须⼤于0
案例:
⼆、@Pattern 利⽤正则⾃定义注解
@Pattern 在 Spring Boot @Validated 中可能是⽐较常见的。
在实体类的字段名上添加@Pattern注解,有个属性regexp,该属性的值就是正则表达式。
//数字和字母组合可为空字符串:
@Pattern(regexp ="^\\s*|[0-9A-Za-z]*$", message ="编号为数字和字母组合")
^ 表⽰匹配字符串的开始位置 (例外⽤在中括号中[ ] 时,可以理解为取反,表⽰不匹配括号中字符串)
$ 表⽰匹配字符串的结束位置
* 表⽰匹配零次到多次
+ 表⽰匹配⼀次到多次 (⾄少有⼀次)
表⽰匹配零次或⼀次
. (圆点)表⽰匹配单个字符
| 表⽰为或者,两项中取⼀项(可⽤于两个正则之间)
( ) ⼩括号表⽰匹配括号中全部字符
[ ] 中括号表⽰匹配括号中⼀个字符范围描述如[0-9 a-z A-Z]
{ } ⼤括号⽤于限定匹配次数如 {n}表⽰匹配n个字符 {n,}表⽰⾄少匹配n个字符 {n,m}表⽰⾄少n,最多m
\ 转义字符如上基本符号匹配都需要转义字符如 \*表⽰匹配*号
\w 表⽰英⽂字母和数字 \W ⾮字母和数字
\d 表⽰数字 \D ⾮数字
\s表⽰空字符串
当使⽤-时,需要放在最后⼀个位置,否则会被当成数字和字母之间区间的标识
⼯作常⽤正则⼯具类整理如下:
utils;
import org.apache.log4j.Logger;
import Matcher;
import Pattern;
/**
* @author xdja
* @date 2020/11/20 16:08
*/
public final class RegexpUtils {
/**
* 匹配email地址
* <p>
* <p>
* 格式: XXX@XXX.XXX.XX
* <p>
* 匹配 : foo@bar 或 foobar@foobar.au
* <p>
* 不匹配: foo@bar 或 $$$@bar
*/
public static final String EMAIL_REGEXP ="^([a-zA-Z0-9]+[-|\\_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[-|\\_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,}$"; /**
* 匹配并提取url
* <p>
* <p>
* 格式: XXXX://XXX.XXX.XXX.XX/XXX.XXX?XXX=XXX
* <p>
* 匹配 : www.suncer 或news://www
* <p>
* 不匹配: c:/window
*/
public static final String URL_REGEXP ="(//w+)://([^/:]+)(://d*)?([^#//s]*)";
/**
* 匹配并提取http
* <p>
* 格式: XXX.XXX.XXX.XX/XXX.XXX?XXX=XXX 或 ftp://XXX.XXX.XXX 或 XXX
* <p>
* 匹配 : www.suncer:8080/index.html?login=true
* <p>
* 不匹配: news://www
*/
public static final String HTTP_REGEXP ="(http|https|ftp)://([^/:]+)(://d*)?([^#//s]*)";
/**
* 匹配并提取http
* <p>
* 格式: XXX.XXX.XXX.XX/XXX.XXX?XXX=XXX 或 ftp://XXX.XXX.XXX 或 XXX
* <p>
* 匹配 : www.suncer:8080/index.html?login=true
* <p>
* 不匹配: news://www
*/
public static final String HTTP_REGEXP_BANNER ="((https|http|ftp|rtsp|mms)?://)([0-9a-z_!~*'()-]+\\.)*([a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(\\.[a-zA-Z]{1,4})(: [0-9]{1,4})?((/?)|(/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+/?)\\.?$";
/**
* 匹配⽇期
* <p>
* <p>
* 格式(⾸位不为0): XXXX-XX-XX或 XXXX-X-X
* <p>
* <p>
* 范围:1900--2099
* <p>
* <p>
* 匹配 : 2005-04-04
* <p>
* <p>
* 不匹配: 01-01-01
*/
public static final String DATE_BARS_REGEXP ="^((((19){1}|(20){1})\\d{2})|\\d{2})-[0,1]?\\d{1}-[0-3]?\\d{1}$";
/**
* wzw
* <p>
* <p>
* 匹配格式 20160606
*/
public static final String DATE_BARS_DAY_REGEXP ="^((((19){1}|(20){1})\\d{2})|\\d{2})[0,1]?\\d{1}[0-3]?\\d{1}$";
/**
* 匹配格式 20130101
*/
public static final String DATE_BARS_REGEXP_SIMPLE =
"([\\d]{4}(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][0-9])|30))|(02((0[1-9])|(1[0-9])|(2[0-8])))))|((((([02468][048])|([135 79][26]))00)|([0-9]{2}(([02468][048])|([13579][26]))))(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][0-9])|30))|(02((0[1-9])|(1[0-9]) |(2[0-9])))))";
/**
* 匹配格式 20130101
*/
public static final String DATE_BARS_REGEXP_HOUR_FULL =
"^\\d{4}-(?:0\\d|1[0-2])-(?:[0-2]\\d|3[01])( (?:[01]\\d|2[0-3])\\:[0-5]\\d)?$";
/**
* 匹配⽇期
* <p>
* <p>
* 格式(⾸位不为0): XXXX-XX-XX或 XXXX-X-X
* <p>
* <p>
* 范围:1900--2099
* <p>
* <p>
* 匹配 : 2005-04-04 11:00:00
* <p>
* <p>
* 不匹配: 01-01-01
*/
public static final String DATE_BARS_REGEXP_HOUR =
"^((((19){1}|(20){1})\\d{2})|\\d{2})-[0,1]?\\d{1}-[0-3]?\\d{1}\\s[0,2]?\\d{1}[0,9]?\\d{1}$";
/**
* 匹配 : 2005-04-04 11:00:00
*/
public static final String DATE_BARS_REGEXP_HOUR_MIN_SS =
"^\\d{4}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D*$";
/**
* 匹配⽇期
* <p>
* <p>
* 格式: XXXX.XX.XX
* <p>
* <p>
* 范围:
* <p>
* <p>
* 匹配 : 2005.04.04
* <p>
* <p>
* 不匹配: 01.01.01
* 不匹配: 01.01.01
*/
public static final String DATE_SLASH_REGEXP ="^[0-9]{4}\\.[0-9]{2}\\.[0-9]{2}$";
/**
* 匹配电话
* <p>
* <p>
* 格式为: 0XXX-XXXXXX(10-13位⾸位必须为0) 或0XXX XXXXXXX(10-13位⾸位必须为0) 或
* <p>
* (0XXX)XXXXXXXX(11-14位⾸位必须为0) 或 XXXXXXXX(6-8位⾸位不为0) 或 XXXXXXXXXXX(11位⾸位不为0)
* <p>
* <p>
* 匹配 : 0371-123456 或 (0371)1234567 或 (0371)12345678 或 010-123456 或 010-******** 或 12345678912
* <p>
* <p>
* 不匹配: 1111-134355 或 0123456789
*/
public static final String PHONE_REGEXP =
"^(?:0[0-9]{2,3}[-//s]{1}|//(0[0-9]{2,4}//))[0-9]{6,8}$|^[1-9]{1}[0-9]{5,7}$|^[1-9]{1}[0-9]{10}$";
/**
* 11位⼿机号格式验证
*/
public static final String MOBILE_PHONE_REGEXP ="^1[3,4,5,6,7,8,9]\\d{9}$";
/**
* 20位联系⽅式格式验证
*/
public static final String PHONE_20_REGEXP ="^[0-9\\-]{1,20}$";
/**
* 匹配⾝份证
* <p>
* 格式为: XXXXXXXXXX(10位) 或 XXXXXXXXXXXXX(13位) 或 XXXXXXXXXXXXXXX(15位) 或 XXXXXXXXXXXXXXXXXX(18位)
* <p>
* 匹配 : 0123456789123
* <p>
* 不匹配: 0123456
*/
public static final String IDENTITY_CARD_REGEXP =
"^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$";
/**
* 匹配⾝份证
* <p>
* 格式为: XXXXXXXXXX(10位) 或 XXXXXXXXXXXXX(13位) 或 XXXXXXXXXXXXXXX(15位) 或 XXXXXXXXXXXXXXXXXX(18位)
* <p>
* 匹配 : 0123456789123
* <p>
* 不匹配: 0123456
*/
public static final String ID_CARD_REGEXP ="^d{18} | $";
/**
* 匹配邮编代码
* <p>
* 格式为: XXXXXX(6位)
* <p>
* 匹配 : 012345
* <p>
* 不匹配: 0123456
*/
public static final String ZIP_REGEXP ="^[0-9]{6}$";
/**
* 不包括特殊字符的匹配 (字符串中不包括符号数学次⽅号^ 单引号' 双引号" 分号; 逗号, 帽号: 数学减号- 右尖括号> 左尖括号< 反斜杠/ 即空格,制表符,回车符等 )
* <p>
* 格式为: x 或⼀个⼀上的字符
* <p>
* 匹配 : 012345
* <p>
* 不匹配: 0123456 // ;,:-<>//s].+$";//
*/
public static final String NON_SPECIAL_CHAR_REGEXP ="^[^'/";
public static final String NON_SPECIAL_CHAR_REGEXP ="^[^'/";
/**
* 匹配⼀位数的0-1整数
*/
public static final String ZERO__TO_ONE_NUMBER ="[0-1]$";
/**
* 匹配⼀位数的0-2整数
*/
public static final String ZERO__TO_TWO_NUMBER ="[0-2]$";
/
**
* 匹配⼀位数的0-2整数
*/
public static final String ZERO__TO_THREE_NUMBER ="[0-3]$";
/**
* 匹配⼀位数的1-4的⾮负整数
*/
public static final String ONE__TO_FOUR_NATURAL_NUMBER ="[1-4]$";
/**
* 匹配⼀位数的0-4的⾮负整数
*/
public static final String ZERO__TO_FOUR_NATURAL_NUMBER ="[0-4]$";
/**
* 匹配⼀位数的1-3的⾮负整数
*/
public static final String ONE_TO_THREE_NATURAL_NUMBER ="[1-3]$";
/**
* 匹配⼀位数的1-3的⾮负整数
*/
public static final String ONE__TO_TWO_NATURAL_NUMBER ="[1-3]$";
/**
* 匹配⼀位数的1-6的⾮负整数
*/
public static final String ONE__TO_SIX_NATURAL_NUMBER ="[1-6]$";
/**
* 匹配0-18的正整数
*/
public static final String ONE_TO_EIGHTEEN_NUMBER ="^(18|[0-9]|(1[0-8]))$";
/**
* 匹配1-99的正整数
*/
public static final String ONE_TO_NINETYNINE_NUMBER ="^(99|[1-9]|([1-9][0-9]))$"; /**
* 匹配⾮负整数(正整数 + 0)
*/
public static final String NON_NEGATIVE_INTEGERS_REGEXP ="^//d+$";
/**
* 匹配带1位⼩数且不超过2位的数
*/
public static final String CAR_LENGTH_REGEXP ="^(\\d|\\d\\d)(\\.\\d)?$";
/**
* 匹配整数位最⼤3位且⼩数位最⼤2位的数
*/
public static final String CAR_LOAD_REGEXP ="^(\\d{1,3})(\\.\\d{1,2})?$";
/**
* 匹配不包括零的⾮负整数(正整数 > 0)
*/
public static final String NON_ZERO_NEGATIVE_INTEGERS_REGEXP ="^[1-9]+//d*$"; /**
* 匹配包括零的正整数
*/
public static final String ZERO_NEGATIVE_INTEGERS_REGEXP ="^[0-9]*[0-9][0-9]*$"; /**
* 匹配正整数
*/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论