Java 注解@Pattern 参数验证------正则验证

对于正则这个东西,对我来说一直是很懵逼的,每次用每次查,然后还是记不住,这次又要在参数上加格式验证了,改了几次,改的心力憔悴,这次又一点一点的从语法开始自己拼写的正则貌似好使了,记录一下。

首先来从基本语法符号开始:

  • ^ 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)
  • $ 表示匹配字符串的结束位置
  • * 表示匹配 零次到多次
  • + 表示匹配 一次到多次 (至少有一次)
  • ? 表示匹配零次或一次
  • . (圆点)表示匹配单个字符
  • | 表示为或者,两项中取一项(可用于两个正则之间)
  • ( ) 小括号表示匹配括号中全部字符
  • [ ] 中括号表示匹配括号中一个字符 范围描述 如[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})$

暂时就这么多了,以后用得着的,再扩展。

  • 19
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值