SpringBoot - 实用工具类库common-util使用详解4(数据校验:ValidateUtil)
四、数据校验工具类(ValidateUtil)
1,基本介绍
ValidateUtil 工具类里面主要是封装了一些常用字段验证方法,首先其内部定义一些常用的正则表达式,具体如下:
//邮箱 public static final String EMAIL_PATTERN = "\\w+@\\w+\\.(com\\.cn)|\\w+@\\w+\\.(com|cn)"; //中文 public static final String CHINESE_PATTERN = "^[\u4e00-\u9fa5]{0,}$"; //数字和字母 public static final String NUMBER_ADN_LETTER = "^[A-Za-z0-9]+$"; //qq public static final String QQ_PATTERN = "/[1-9][0-9]{4,}/"; //数字 public static final String NUMBER_PATTERN = "[0-9]+"; //字母 public static final String LETTER_PATTERN = "[a-zA-Z]+"; //邮编 public static final String ZIPCODE_PATTERN = "\\p{Digit}{6}"; //手机 public static final String PHONE_PATTERN = "^(13[0-9]|14[579]|15[^4,\\D]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$"; //固定电话 public static final String TELEPHONE_PATTERN = "^(0\\d{2,3}-)?(\\d{7,8})(-(\\d{3,}))?$"; //400固话 public static final String TELEPHONE_400_PATTERN = "((400)(\\d{7}))|((400)-(\\d{3})-(\\d{4}))"; //中国身份证 public static final String IDCARD_PATTERN = "^((11|12|13|14|15|21|22|23|31" + "|32|33|34|35|36|37|41|42|43|44|45|46|50|51|" + "52|53|54|61|62|63|64|65|71|81|82|91)\\d{4})" + "((((19|20)(([02468][048])|([13579][26]))0229))|" + "((20[0-9][0-9])|(19[0-9][0-9]))((((0[1-9])|(1[0-2]))" + "((0[1-9])|(1\\d)|(2[0-8])))|((((0[1,3-9])" + "|(1[0-2]))(29|30))|(((0[13578])|(1[02]))31))))" + "((\\d{3}(x|X))|(\\d{4}))$"; //用户名(3-15位,并且只能为数字或英文字符) public static final String USERNAME_PATTERN = "^[A-Za-z0-9_]{3,15}$"; //密码 public static final String PASSWORD_PATTERN = "^(?![0-9]+$)[0-9A-Za-z]{6,20}$"; //uuid public static final String UUID_PATTERN = "[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}"; //年 public static final String YEAR_PATTERN = "^(19|20)\\d{2}$"; //时间 public static final String TIME_PATTERN = "^(?:(?:([01]?\\d|2[0-3]):)?([0-5]?\\d):)?([0-5]?\\d)$"; //日期类型 public static final String DATE_PATTERN = "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))"; //时间戳 public static final String TIME_STAMP_PATTERN = "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\s]?((((0?[13578])|(1[02]))[\\-\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\s]?((((0?[13578])|(1[02]))[\\-\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\s]?((0?[1-9])|(1[0-9])|(2[0-8])))))) ([2][0-3]|[0-1][0-9]|[1-9]):[0-5][0-9]:([0-5][0-9]|[6][0])$"; //ip v4 public static final String IPV4_PATTERN = "([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"; //ip v6 public static final String IPV6_PATTERN = "([0-9a-f]+)\\:([0-9a-f]+)\\:([0-9a-f]+)\\:([0-9a-f]+)\\:([0-9a-f]+)\\:([0-9a-f]+)\\:([0-9a-f]+)\\:([0-9a-f]+)"; //url public static final String URL_PATTERN = "^(http|https|ftp)\\://([a-zA-Z0-9\\.\\-]+(\\:[a-zA-Z0-9\\.&%\\$\\-]+)*@)?((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\.[a-zA-Z]{2,4})(\\:[0-9]+)?(/[^/][a-zA-Z0-9\\.\\,\\?\\'\\\\/\\+&%\\$#\\=~_\\-@]*)*$"; //域名 public static final String DOMAIN_PATTERN = "^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$"; //整数或者浮点数 public static final String INT_OR_FLOAT_PATTERN = "^\\d+\\.\\d+|\\d+$"; //浮点数 public static final String FLOAT_PATTERN = "^(-?\\d+)(\\.\\d+)?$"; //正整数 public static final String POSITIVE_INTEGER = "[1-9]+\\d{0,10}"; //军官证@since 0.3 public static final String ARMY_ID_CARD = "南字第(\\d{6,8})号|北字第(\\d{6,8})号|沈字第(\\d{6,8})号|兰字第(\\d{6,8})号|成字第(\\d{6,8})号|济字第(\\d{6,8})号|广字第(\\d{6,8})号|海字第(\\d{6,8})号|空字第(\\d{6,8})号|参字第(\\d{6,8})号|政字第(\\d{6,8})号|后字第(\\d{6,8})号|装字第(\\d{6,8})号";
2,邮箱格式验证
(1)isEmail() 方法用于验证输入的字符串是否是邮箱。ValidateUtil.isEmail("123456@hangge.com"); // true ValidateUtil.isEmail("123456"); // false

(2)isNotEmail() 方法用于验证字符串是否不是邮箱,和 isEmail() 方法的验证结果刚好相反。
(2)isNotChinese() 方法验证字符串是否不完全是中文,和 isChinese() 方法的验证结果刚好相反。
(2)isLetter() 方法用于验证字符串是否是字母:
(3)isNumberLetter() 方法验证字符串是否是字母或者数字或者数字+字母,而 isNotNumberLetter() 方法的验证结果则与 isNumberLetter() 相反。
(2)isNotPhone() 方法用于验证字符串是否为非手机号,返回的结果 isPhone() 方法相反。
(2)isNotTelephone() 方法用于验证字符串是否不是固定电话,返回的结果 isTelephone() 方法相反。
(2)isNotIdCard() 方法用于验证输入的字符串是否不是身份证,返回的结果 isIdCard() 方法相反。
(2)isTimestamp() 方法用于验证输入的字符串时间戳格式是否正确,验证的日期格式必须是 yyyy-MM-dd HH:mm:ss,该方法可做到对闰年平年的 2 月精准验证。而 isNotTimestamp() 方法用于验证输入的字符串时间戳格式是否不是时间戳,检测结果和 isTimestamp() 相反。
(3)isYear() 方法用于验证输入的年的格式是否正确(范围必须是 1900 - 2099),而 isNotYear() 检测结果和 isYear() 相反。
(4)isTime() 方法用于验证输入的时间格式是否正确,而 isNotTime() 检测结果和 isTime() 相反。
(2)isNotUuid() 方法用于检测传入的参数是否是 uuid,和 isUuid() 检验结果相反:
(2)isNotIP() 方法用于检验字符串是否不是 ip,检验结果和 isIp() 方法相反。
(2)isNotDomain() 方法用于验证输入的字符串是否不是域名,检验结果和 isDomain() 方法相反。
(2)isNotUrl() 方法用于验证字符串是否不是 url,和 isUrl() 检验结果相反:
(2)isNotArmyIdCard() 用于判断非中国的军官证,和 isArmyIdCard() 检验结果相反:
ValidateUtil.isNotEmail("123456@hangge.com"); // false ValidateUtil.isNotEmail("123456"); // true
3,是否是中文
(1)isChinese() 方法用于验证字符串是否完全是中文:ValidateUtil.isChinese("欢迎访问"); // true ValidateUtil.isChinese("欢迎访问hangge.com"); // false ValidateUtil.isChinese("hangge.com"); // false
(2)isNotChinese() 方法验证字符串是否不完全是中文,和 isChinese() 方法的验证结果刚好相反。
ValidateUtil.isNotChinese("欢迎访问"); // false ValidateUtil.isNotChinese("欢迎访问hangge.com"); // true ValidateUtil.isNotChinese("hangge.com"); // true
4,是否是数字、字母
(1)isNumber() 方法用于验证字符串是否是数字。isNotNumber() 方法则验证字符串是否不是数字,它的结果与 isNumber() 方法相反。// 是否是数字 ValidateUtil.isNumber("1234"); // false ValidateUtil.isNumber("1234a"); // true // 是否不是数字 ValidateUtil.isNotNumber("1234"); // false ValidateUtil.isNotNumber("1234a"); // true
(2)isLetter() 方法用于验证字符串是否是字母:
ValidateUtil.isLetter("abc"); // true ValidateUtil.isLetter("123abc"); // false
(3)isNumberLetter() 方法验证字符串是否是字母或者数字或者数字+字母,而 isNotNumberLetter() 方法的验证结果则与 isNumberLetter() 相反。
ValidateUtil.isNumberLetter("abc"); // true ValidateUtil.isNumberLetter("123abc"); // true ValidateUtil.isNumberLetter("123a..."); // false ValidateUtil.isNotNumberLetter("abc"); // false ValidateUtil.isNotNumberLetter("123abc"); // false ValidateUtil.isNotNumberLetter("123a..."); // true
5,整数、浮点数验证
目前提供了如下几种常用的整数、浮点数的验证方法:- isPositiveInteger() 方法用于判断输入的字符是否是正整数。
- isNonnegativeInteger() 方法用于验证输入的字符串是否不是负整数。
- isFloat() 方法用于判断输入的字符串是否是浮点数。
- isNotFloat() 方法用于判断输入的字符串是否不是浮点数。验证结果和 isFloat() 相反。
- isPositiveFloat() 方法用于验证字符串是否是正浮点数。
- isNegativeFloat() 方法用于验证字符串是否是负浮点数。
- isNotNegativeFloat() 方法用于验证字符串是否不是负浮点数,验证结果和 isNegativeFloat() 相反。
- isIntOrFloat() 方法用于验证字符串是否是整数或者是浮点数。
- isNotIntOrFloat() 方法用于验证字符串是否不是整数或者不是浮点数。验证结果和 isIntOrFloat() 相反。
ValidateUtil.isNonnegativeInteger("11"); // true ValidateUtil.isNonnegativeInteger("0"); // true ValidateUtil.isNonnegativeInteger("-11"); // false
6,邮编验证
isZipCode() 方法用于验证字符串是否是中国的合法邮编:ValidateUtil.isZipCode("430056");// true ValidateUtil.isZipCode("12345678");// false
7,手机号验证
(1)isPhone() 方法验证字符串是否是中国的手机号,涵盖 13、14、15、16、17、18、19 开头的手机号。ValidateUtil.isPhone("13510931498"); // true ValidateUtil.isPhone("11510931498"); // false
(2)isNotPhone() 方法用于验证字符串是否为非手机号,返回的结果 isPhone() 方法相反。
ValidateUtil.isNotPhone("13510931498"); // false ValidateUtil.isNotPhone("11510931498"); // true
8,固定电话验证
(1)isTelephone() 方法用于验证字符串是否为固定电话,包括普通固话和 400 固话。ValidateUtil.isTelephone("010-86551122"); // true ValidateUtil.isTelephone("400-8075-592"); // true ValidateUtil.isTelephone("4008075592"); // true ValidateUtil.isTelephone("5008075592"); // false
(2)isNotTelephone() 方法用于验证字符串是否不是固定电话,返回的结果 isTelephone() 方法相反。
ValidateUtil.isNotTelephone("010-86551122"); // false ValidateUtil.isNotTelephone("400-8075-592"); // false ValidateUtil.isNotTelephone("4008075592"); // false ValidateUtil.isNotTelephone("5008075592"); // true
9,身份证验证
(1)isIdCard() 方法用于验证中国的居民身份证号(属于严格验证),是则返回 true,不是则返回 false。
ValidateUtil.isIdCard("411722197508214014"); // true ValidateUtil.isIdCard("111111111111111111"); // false
(2)isNotIdCard() 方法用于验证输入的字符串是否不是身份证,返回的结果 isIdCard() 方法相反。
ValidateUtil.isNotIdCard("411722197508214014"); // false ValidateUtil.isNotIdCard("111111111111111111"); // true
10,日期时间验证
(1)isDate() 方法用于验证输入的字符串时间格式是否正确,验证的日期格式必须是 yyyy-MM-dd,该方法可做到对闰年平年的 2 月精准验证。而 isNotDate() 方法用于验证输入的字符串是否不是时间格式,和 isDate() 方法的检验结果相反。ValidateUtil.isDate("2017-01-03"); // true ValidateUtil.isDate("2017-01-32"); // false ValidateUtil.isNotDate("2017-01-03"); // false ValidateUtil.isNotDate("2017-01-32"); // true
(2)isTimestamp() 方法用于验证输入的字符串时间戳格式是否正确,验证的日期格式必须是 yyyy-MM-dd HH:mm:ss,该方法可做到对闰年平年的 2 月精准验证。而 isNotTimestamp() 方法用于验证输入的字符串时间戳格式是否不是时间戳,检测结果和 isTimestamp() 相反。
ValidateUtil.isTimestamp("2017-02-28 23:59:59"); // true ValidateUtil.isTimestamp("2017-02-29 23:59:59"); // false ValidateUtil.isNotTimestamp("2017-02-28 23:59:59"); // false ValidateUtil.isNotTimestamp("2017-02-29 23:59:59"); // true
(3)isYear() 方法用于验证输入的年的格式是否正确(范围必须是 1900 - 2099),而 isNotYear() 检测结果和 isYear() 相反。
ValidateUtil.isYear("1922"); // true ValidateUtil.isYear("1899"); // false ValidateUtil.isNotYear("1922"); // false ValidateUtil.isNotYear("1899"); // true
(4)isTime() 方法用于验证输入的时间格式是否正确,而 isNotTime() 检测结果和 isTime() 相反。
ValidateUtil.isTime("12:56:59"); // true ValidateUtil.isTime("12:56:60"); // false ValidateUtil.isNotTime("12:56:60"); // false ValidateUtil.isNotTime("12:56:60"); // true
11,uuid 验证
(1)isUuid() 方法用于检测传入的参数是否是 uuid,正常情况是数据字母和"-"组成 36 为长度字符串,如果去掉"-"也必须保持有 32 位长度:ValidateUtil.isUuid("de07884ca92c4e2696eab18313a46d99"); // true ValidateUtil.isUuid("1241285e-f10d-486e-bd7c-a86e032828e1"); // true ValidateUtil.isUuid("1241285e-f10d-486e-bd7c-a86e032828e1dd"); // false
(2)isNotUuid() 方法用于检测传入的参数是否是 uuid,和 isUuid() 检验结果相反:
ValidateUtil.isNotUuid("de07884ca92c4e2696eab18313a46d99"); // false ValidateUtil.isNotUuid("1241285e-f10d-486e-bd7c-a86e032828e1"); // false ValidateUtil.isNotUuid("1241285e-f10d-486e-bd7c-a86e032828e1dd"); // true
12,IP 地址验证
(1)isIP() 方法用于检测 ip 地址,包括 ipv4 和 ipv6:ValidateUtil.isIP("192.168.15.96"); // true //ipv6可小写 ValidateUtil.isIP("ABCD:EF01:2345:6789:ABCD:EF01:2345:6789"); // true
(2)isNotIP() 方法用于检验字符串是否不是 ip,检验结果和 isIp() 方法相反。
ValidateUtil.isNotIP("aa"); // true //ipv6可小写 ValidateUtil.isNotIP("hhkkejh"); // true
13,域名验证
(1)isDomain() 方法用于验证域名是否合法:ValidateUtil.isDomain("www.hangge.com"); // true
(2)isNotDomain() 方法用于验证输入的字符串是否不是域名,检验结果和 isDomain() 方法相反。
ValidateUtil.isNotDomain("www.hangge.com"); // false
14,url 验证
(1)isUrl() 方法用于验证 url 是否合法,目前无法识别中文。ValidateUtil.isUrl("https://www.baidu.com:8080/a/n?a=5"); // true ValidateUtil.isUrl("https://192.168.15.96/a/n?a=5"); // true
(2)isNotUrl() 方法用于验证字符串是否不是 url,和 isUrl() 检验结果相反:
ValidateUtil.isNotUrl("https://www.baidu.com:8080/a/n?a=5"); // false ValidateUtil.isNotUrl("https://192.168.15.96/a/n?a=5"); // false
15,非法字符验证
isContainsForbiddenCharacter() 方法用于判断输入的字符是否包含非法的字符,通常用于判断 xss 和 sql 注入字符。ValidateUtil.isContainsForbiddenCharacter("location.href"); // true ValidateUtil.isContainsForbiddenCharacter("delete a"); // true
16,军官证验证
(1)isArmyIdCard() 用于判断中国的军官证:ValidateUtil.isArmyIdCard("北字第7682126号"); // true ValidateUtil.isArmyIdCard("美字第7682126号"); // false
(2)isNotArmyIdCard() 用于判断非中国的军官证,和 isArmyIdCard() 检验结果相反:
ValidateUtil.isNotArmyIdCard("北字第7682126号"); // false ValidateUtil.isNotArmyIdCard("美字第7682126号"); // true