对于正则这个东西,对我来说一直是很懵逼的,每次用每次查,然后还是记不住,这次又要在参数上加格式验证了,改了几次,改的心力憔悴,这次又一点一点的从语法开始自己拼写的正则貌似好使了,记录一下。
首先来从基本语法符号开始:
^
表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)$
表示匹配字符串的结束位置*
表示匹配 零次到多次+
表示匹配 一次到多次 (至少有一次)?
表示匹配零次或一次.
(圆点)表示匹配单个字符|
表示为或者,两项中取一项(可用于两个正则之间)( )
小括号表示匹配括号中全部字符[ ]
中括号表示匹配括号中一个字符 范围描述 如[0-9 a-z A-Z]{ }
大括号用于限定匹配次数 如 {n}表示匹配n个字符 {n,}表示至少匹配n个字符 {n,m}表示至少n,最多m\
转义字符 如上基本符号匹配都需要转义字符 如\*
表示匹配*号\w
表示英文字母和数字\W
非字母和数字\d
表示数字\D
非数字\s
表示空字符串- 当使用
-
时,需要放在最后一个位置,否则会被当成数字和字母之间区间的标识
语法规则貌似很简单的嘛,用的时候直接按照规则拼就完事了,试试看吧。
下面是我使用的demo,测了一下目前没发现什么问题:
下面的注解使用的是import javax.validation.constraints.*
下面的注解类。
import javax.validation.constraints.Email;
@ApiModelProperty("邮箱")
@Email(message = "邮箱格式有误")
private String email;
首先是首尾匹配,那么就要使用^
和$
,使用*
或者\
的时候,就要使用转义字符了(下面是在java中使用的,转义符号需要两个斜杠配合使用才好使)。
然后是长度限制时,可以使用大括号{ }
{n}表示匹配n个字符 {n,}表示至少匹配n个字符 {n,m}表示至少n,最多m
数字和字母组合可为空字符串 :@Pattern(regexp = "^\\s*|[0-9A-Za-z]*$", message = "编号为数字和字母组合")
联系电话:@Pattern(regexp = "^[\\d\\*]{7,12}$", message = "联系电话输入有误")
由于区号分为3位和四位的,然后座机号码又分为7位和8位的,所以这里校验的长度是7-12位,并且这里添加了*
表示脱敏的手机号仍然可以通过校验。
中英文非空字符串(可屏蔽emoji表情):@Pattern(regexp = "^[\\u0391-\\uFFE5\\w]+$", message = "名称含有特殊字符")
网址:@Pattern(regexp = "^[http://]?([\\w]+\\.)+[\\w]+(/[\\w.\\w/?%&=]*)?", message = "网址输入有误")
当@Pattern
遇到BigDecimal
就不好使了,当参数类型是BigDecimal,在参数上使用@Pattern时就报错了,提示@Pattern中没有这个验证BigDecimal的方法。
于是我就另外写了一个方法,单独验证BigDecimal类型的数值。
/**
* 校验Decimal类型的数值
* @param obj
* @return
*/
public static boolean judgeTwoDecimal(Object obj) {
boolean flag = false;
try {
if (obj != null) {
String source = obj.toString();
// 判断是否是整数或者是携带一位或者两位的小数
Pattern pattern = Pattern.compile("^[+]?([0-9]{0,16}(.[0-9]{1,2})?)$");
if (pattern.matcher(source).matches()) {
flag = true;
}
}
} catch (Exception e) {
e.getMessage();
}
return flag;
}
密码:长度为6-32位,并且必须包含数字、字母、特殊符号中的至少两种:@Pattern(regexp = "^(?=.*[a-zA-Z0-9].*)(?=.*[a-zA-Z.!@#$%^&*].*)(?=.*[0-9.!@#$%^&*].*).{6,32}$", message = "密码至少包含数字,字母和符号的两种")
贴几个网上找的正则,貌似大概看得懂,然后还会有点用处的demo
帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$
中文:^[\u0391-\uFFE5]+$
(这里使用了+
表示至少一个,即是非空且只能中文,可空时+可改为*)
邮政编码:^[1-9]\d{5}$
首尾的匹配就不说了,邮政编码为6位,首部已经匹配了一位了,剩余5位,于是用{5}
手机号码:^((\d2,3)|(\d{3}\-))?13\d{9}$
感觉这个是有问题的,首先?
是表示零次或一次,问号前面表示电话的前缀,后面13
表示匹配13开头的手机号,现在手机号已经有很多种开头的了,匹配手机号开头的话,13
换成1\d{1}
会更好,\d{9}
表示9位数字,那么这个正则当输入一个15位的数字串也是可以通过的(只是猜测,没有验证)。
英文字符数字串:^[A-Za-z0-9]+$
,这个比较简单明了,我使用的也是这个,\w
也是等效的,我还没试过。
英文数字加下划线串:^\w_$
邮箱字段验证:@Email(message = "邮箱格式有误")
验证整数:^-?[0-9]\\d*$
正整数:^[0-9]\\d*$
负整数:^-[0-9]\\d*$
数字:^([+-]?)\\d*\\.?\\d+$
正数:^[1-9]\\d*|0$
负数:^-[1-9]\\d*|0$
URL:^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$
IP地址:^(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)$
,IP地址这个如果用字符串明文存的话,可以试下这个正则,我见有地方建议将IP转为long型数字存储的,不过我还没试过。
身份证号:^(\\d{15}$|^\\d{18}$|^\\d{17}(\\d|X|x))$
,这个只是初步验证,关于身份证号,一般都有专门的工具类,这个可以用在注解里面进行初步验证。
GPS经度:^(-|\\+)?(180\\.0{4,6}|(\\d{1,2}|1([0-7]\\d))\\.\\d{4,6})$
GPS纬度:^(-|\\+)?(90\\.0{4,6}|(\\d|[1-8]\\d)\\.\\d{4,6})$
暂时就这么多了,以后用得着的,再扩展。