zoukankan      html  css  js  c++  java
  • 正则匹配

    1.调用demo

    ValidUtil.valid("【设备编码】50内长度数字", body.getDeviceNum(), "{'required':true,'regex':'" + RegexConstants.DEVICE_NUM_PATTERN + "'}");
    ValidUtil.valid("【任务状态】", body.getStatus(), "{'required':true,'numeric':{'min':1,'max':5}}");
    ValidUtil.valid("【算法类型】1:中心算法 2:边缘算法 3:第三方算法", body.getAlgType(), "{'required':false,'numeric':{'min':1,'max':3}}");
    ValidUtil.valid("【任务类型】1:切图任务,2:采集任务", body.getTaskType(), "{'required':true,'numeric':{'min':1,'max':2}}");
    ValidUtil.valid("【帧率】,", body.getVideoFps(), "{'required':true,'numeric':{'min':1,'max':1000}}");
    ValidUtil.valid("【图片组数】,", body.getPictureNum(), "{'required':true,'numeric':{'min':1,'max':" + body.getVideoFps() + "}}");

    2.参数校验类

    package com.awifi.capacity.analysis.task.distribute.common.util;
    
    import com.alibaba.fastjson.JSON;
    import com.awifi.capacity.analysis.task.distribute.common.constant.RegexConstants;
    import com.awifi.capacity.analysis.task.distribute.common.constant.ReturnCode;
    import com.awifi.capacity.analysis.task.distribute.common.exception.ValidException;
    import org.apache.commons.lang.StringUtils;
    
    import java.text.MessageFormat;
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    
    /**
     * 版权所有: 爱WiFi无线运营中心
     * 创建日期:2017年1月17日 下午2:05:15
     * 创建作者:hw
     * 文件名称:ValidUtil.java
     * 版本:  v1.0
     * 功能:参数校验
     * 修改记录:
     */
    @SuppressWarnings("unchecked")
    public class ValidUtil {
    
        /**
         * 校验
         * @param key 键
         * @param value 值
         * @param rules 规则
         * @author hw  
         * @date 2017年1月17日 下午2:26:47
         */
        public static void valid(String key, Object value, String rules){
            notBlank("rules", rules);//校验规则不允许为空
            if(rules.indexOf("{") == -1){//判断rules是否属于json格式的
                validSingle(key, value, rules);//校验单参数
            }else {
                validMulti(key, value, rules);//校验正则或多个参数
            }
        }
        
        /**
         * 校验单参数
         * @param key 键
         * @param value 值
         * @param rule 规则
         * @author hw  
         * @date 2017年1月17日 下午2:26:47
         */
        private static void validSingle(String key, Object value, String rule){
            if(rule.trim().equals("required")){//必填校验
                notBlank(key, value);//非空字符串校验
            }else if(rule.trim().equals("numeric")){//数字校验
                isNumeric(key, value);//数字校验
            }else if(rule.trim().equals("arrayNotBlank")) {//数组内部不允许存在空值(null|"")的校验
                arrayNotBlank(key, value);//数组内部不允许存在空值(null|"")的校验
            } else if (rule.trim().equals("length")){//长度校验,暂只支持字符串
                length(key, value, CastUtil.toInteger(rule));
            }else{
                throw new ValidException(ReturnCode.RULE_OVER_EX.getCode(), MessageFormat.format(ReturnCode.RULE_OVER_EX.getMsg(), rule));//rule[{0}]超出了范围!
            }
        }
        
        /**
         * 校验正则或多个参数
         * @param key 键
         * @param value 值
         * @param rules 规则
         * @author hw  
         * @date 2017年1月17日 下午2:26:47
         */
        private static void validMulti(String key, Object value, String rules) {
            Map<String, Object> ruleMap = JSON.parseObject(rules, LinkedHashMap.class);
            for (Map.Entry<String, Object> entry : ruleMap.entrySet()) {
                String ruleKey = entry.getKey();//规则 键
                Object ruleValue = entry.getValue();//规则 值
                notBlank("ruleKey", ruleKey);//规则 键 不允许为空
                notNull("ruleValue", ruleValue);//规则 值 不允许为空
                //没有配必填参数默认为不必填。不必填在值为空的情况下不校验
                if(!ruleKey.trim().equals("required") ){
                    if(value==null || (value instanceof String && "".equals(value))){
                        return;
                    }
                }
                if (ruleKey.trim().equals("required")) {//必填校验
                    isBoolean("ruleValue", ruleValue);//规则 值 必须为boolean
                    if ((Boolean) ruleValue) {
                        //非空字符串校验required情况为true下
                        notBlank(key, value);
                    }else {
                        //非空字符串校验required情况为false下
                        if(value==null || (value instanceof String && "".equals(value))){
                            return;
                        }else {
                            notBlank(key, value);
                        }
                    }
                } else if (ruleKey.trim().equals("numeric")) {//数字校验
                    if (ruleValue instanceof Boolean && !((Boolean) ruleValue)) {//当为false时,不校验
                        return;
                    }
                    isNumeric(key, value);//数字校验
                    isNumericRange(key, value, ruleValue);//数字最大/最小校验
                } else if (ruleKey.trim().equals("arrayNotBlank")) {//数组内部不允许存在空值(null|"")的校验
                    isBoolean("ruleValue", ruleValue);//规则 值 必须为boolean
                    if ((Boolean) ruleValue) {
                        arrayNotBlank(key, value);//数组内部不允许存在空值(null|"")的校验
                    }
                } else if (ruleKey.trim().equals("length")) {//长度校验,暂只支持字符串
                    length(key, value, (Integer) ruleValue);
                } else if (ruleKey.trim().equals("regex")) {//正则匹配
                    isString("ruleValue", ruleValue);//规则 值 必须为字符串
                    regex(key, value, (String) ruleValue);
                }
            }
        }
    
        /**
         * 字符串判断
         * @param key 键
         * @param value 值
         * @author hw  
         * @date 2017年1月17日 下午2:37:26
         */
        private static void isString(String key, Object value){
            if(!(value instanceof String)){
                throw new ValidException(ReturnCode.MUST_STRING_TYPE_EX.getCode(), MessageFormat.format(ReturnCode.MUST_STRING_TYPE_EX.getMsg(), key));
            }
        }
        
        /**
         * 字符串判断
         * @param key 键
         * @param value 值
         * @author hw  
         * @date 2017年1月17日 下午2:37:26
         */
        private static void isBoolean(String key, Object value){
            if(!(value instanceof Boolean)){
                throw new ValidException(ReturnCode.MUST_BOOLEAN_TYPE_EX.getCode(), MessageFormat.format(ReturnCode.MUST_BOOLEAN_TYPE_EX.getMsg(), key));
            }
        }
        
        /**
         * 数字判断
         * @param key 键
         * @param value 值
         * @author hw  
         * @date 2017年1月22日 上午10:14:54
         */
        private static void isNumeric(String key, Object value){
            if(value == null){
                return;
            }
            if(value instanceof Integer || value instanceof Long){
                return;
            }
            isString(key, value);
            String valueStr = (String)value;
            if(!RegexUtil.match(valueStr, RegexConstants.NUMBER_PATTERN)){
                throw new ValidException(ReturnCode.MUST_NUMBER_TYPE_EX.getCode(), MessageFormat.format(ReturnCode.MUST_NUMBER_TYPE_EX.getMsg(), key));
            }
        }
        
        /**
         * 数字最大/最小校验
         * @param key 
         * @param value 
         * @param ruleValue 
         * @author 亢燕翔  
         * @date 2017年1月22日 下午2:23:16
         */
        private static void isNumericRange(String key, Object value, Object ruleValue) {
            if(value == null){//当值为空时,流程结束
                return;
            }
            if(ruleValue instanceof Boolean){//ruleValue 为boolean时,流程结束
                return;
            }
            /* 规则  不允许为为空,防止出现  rlueValue=="" 的情况 */
            if(ruleValue instanceof String){
                String ruleValueStr = (String)ruleValue;//校验规则 转化为字符串
                if(ruleValueStr == null || ruleValueStr.trim().length() <= 0){//非空校验
                    throw new ValidException(ReturnCode.NOT_ALLOW_NULL_EX.getCode(), MessageFormat.format(ReturnCode.NOT_ALLOW_NULL_EX.getMsg(), "规则"));
                }
            }
            /* value 处理,转换为int */
            isNumeric("numeric.value", value);//判断value是否为数字
            Integer valueInt = CastUtil.toInteger(value);
            
            Map<String, Integer> numMap = JsonUtil.fromJson(ruleValue.toString(), HashMap.class);
            /* numeric.min 处理,转换为int */
            Object minObj = numMap.get("min");
            isNumeric("numeric.min", minObj);//判断规则中的最小值[min]是否为数字
            Integer min =CastUtil.toInteger(minObj);
            if(min != null && min > valueInt){
                throw new ValidException(ReturnCode.LOW_NUMBER_EX.getCode(), MessageFormat.format(ReturnCode.LOW_NUMBER_EX.getMsg(), new Object[]{key,min}));
            }
            /* numeric.max 处理,转换为int */
            Object maxObj = numMap.get("max");
            isNumeric("numeric.max", maxObj);//判断规则中的最小值[min]是否为数字
            Integer max =CastUtil.toInteger(maxObj);
            if(max == null){
                return;
            }
            if(max < valueInt){
                throw new ValidException(ReturnCode.UP_NUMBER_EX.getCode(), MessageFormat.format(ReturnCode.UP_NUMBER_EX.getMsg(), new Object[]{key,min}));
            }
        }
        
        /**
         * 非空判断
         * @param key 键
         * @param value 值
         * @author hw  
         * @date 2017年1月17日 下午2:08:08
         */
        private static void notNull(String key, Object value){
            if(value == null){
                throw new ValidException(ReturnCode.NOT_ALLOW_NULL_EX.getCode(), MessageFormat.format(ReturnCode.NOT_ALLOW_NULL_EX.getMsg(),key));//{0}不允许为空!
            }
        }
        
        /**
         * 非空字符串判断
         * @param key 键
         * @param value 值
         * @author hw  
         * @date 2017年1月17日 下午2:08:08
         */
        private static void notBlank(String key, Object value){
            notNull(key, value);//非空判断
            //isString(key, value);//字符串判断
            if(!(value instanceof String)){
                return;
            }
            String valueStr = (String)value;
            if(valueStr.trim().length() <= 0){
                throw new ValidException(ReturnCode.NOT_ALLOW_NULL_EX.getCode(), MessageFormat.format(ReturnCode.NOT_ALLOW_NULL_EX.getMsg(),key));//{0}不允许为空!
            }
        }
        
        /**
         * 数组内部不允许存在空值(null|"")的校验
         * @param key 键
         * @param value 值
         * @author hw  
         * @date 2017年2月9日 上午9:29:17
         */
        private static void arrayNotBlank(String key, Object value){
            notNull(key, value);//非空判断
            if(!(value instanceof Object[])){
                return;
            }
            Object[] objArray= (Object[])value;
            int maxLength = objArray.length;
            if(maxLength <= 0){
                throw new ValidException(ReturnCode.NOT_ALLOW_NULL_EX.getCode(), MessageFormat.format(ReturnCode.NOT_ALLOW_NULL_EX.getMsg(),"数组内容"));//{0}不允许为空!
            }
            Object obj = null;
            for(int i=0; i<maxLength; i++){
                obj = objArray[i];
                if(obj == null){//对象不允许为空
                    throw new ValidException(ReturnCode.NOT_ALLOW_NULL_EX.getCode(), MessageFormat.format(ReturnCode.NOT_ALLOW_NULL_EX.getMsg(),key));//{0}不允许为空!
                }
                if(obj instanceof String){//字符串不允许为""
                    String str = (String)obj;
                    if(str.trim().length() <= 0){
                        throw new ValidException(ReturnCode.NOT_ALLOW_NULL_EX.getCode(), MessageFormat.format(ReturnCode.NOT_ALLOW_NULL_EX.getMsg(),key));//{0}不允许为空!
                    }
                }
            }
            
        }
    
        /**
         * 长度校验,暂只支持字符串
         * @param key 键
         * @param value 值
         * @param length 长度
         * @author hw
         * @date 2017年11月7日 下午2:20:40
         */
        private static void length(String key, Object value, int length){
            if(!(value instanceof String)){//不是字符串,自动跳过
                return;
            }
            String valueStr = (String)value;
            if(StringUtils.isBlank(valueStr)){//空串,自动跳过
                return;
            }
            if(valueStr.length() > length){
                throw new ValidException(ReturnCode.UP_PARAM_LENGTH_EX.getCode(), MessageFormat.format(ReturnCode.UP_PARAM_LENGTH_EX.getMsg(), new Object[]{key, value, length}));//{0}不允许为空!
            }
        }
    
        /**
         * 正则匹配
         * @param key 键
         * @param value 值
         * @param pattern 正则公式
         * @author hw  
         * @date 2017年1月17日 下午2:19:39
         */
        private static void regex(String key, Object value, String pattern){
            //notNull(key, value);//非空判断
            if(value == null){
                return;
            }
            isString(key, value);//字符串判断
            String valueStr = (String)value;
            if(!RegexUtil.match(valueStr, pattern)){
                throw new ValidException(ReturnCode.NOT_FIT_REGULAR_EX.getCode(), MessageFormat.format(ReturnCode.NOT_FIT_REGULAR_EX.getMsg(), key));//{0}不符合正则规范!
            }
        }
    
    }

    3.正则匹配工具类

    package com.awifi.capacity.analysis.task.distribute.common.util;
    
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * 版权所有: 爱WiFi无线运营中心
     * 创建日期:2017年1月17日 下午2:17:45
     * 创建作者:hw
     * 文件名称:RegexUtil1.java
     * 版本:  v1.0
     * 功能:正则匹配工具类
     * 修改记录:
     */
    public class RegexUtil {
    
        /**
         * 正则匹配
         * @param str 待匹配字符串
         * @param pattern 正则表达式
         * @return true 成功、false 失败
         * @author hw  
         * @date 2017年1月17日 下午2:17:25
         */
        public static boolean match(String str, String pattern){
            return match(str, pattern, null);
        }
        
        /**
         * 正则匹配
         * @param str 待匹配字符串
         * @param pattern 正则表达式
         * @param flags flags
         * @return true 成功、false 失败
         * @author hw  
         * @date 2016年7月25日 下午12:13:16
         */
        public static boolean match(String str, String pattern, Integer flags){
            if(str == null){
                return false;
            }
            Pattern p = null;
            if(flags == null){
                p = Pattern.compile(pattern);
            }else {
                p = Pattern.compile(pattern, flags);
            }
            Matcher m = p.matcher(str);
            return m.matches();
        }
    
    }

    4.正则定义类

    package com.awifi.capacity.analysis.task.distribute.common.constant;
    
    /**
     * @ClassName RegexConstants
     * @Description 正则常量
     * @Author hw
     * @Date 2019/7/16 19:53
     * @Version 1.0
     **/
    public class RegexConstants {
        /** 数字 */
        public static final String NUMBER_PATTERN = "^-?\\d+$";
        /**50以内字符 非空*/
        public static final String DEVICE_NUM_PATTERN = "^[0-9]{5,50}$";
        /**50以内字符 非空*/
        public static final String STRING_1_50_PATTERN = "^.{1,50}$";
        /**50以内字符 非空*/
        public static final String STRING_1_250_PATTERN = "^.{1,250}$";
        /** xx_xx_xx */
        public static final String ALG_CODE_PATTERN = "^([1-9]{0,5})_([1-9]{0,5})_([1-9]{0,5})$";
    }

    5.返回标识类

    package com.awifi.capacity.analysis.task.distribute.common.constant;
    
    /**
     * @ClassName ReturnCode
     * @Description 返回标识类
     * @Author hw
     * @Date 2019/6/25 8:22 PM
     * @Version 1.0
     **/
    public enum ReturnCode {
        SUCCESS("0", "成功"),
        FAIL("1", "失败"),
        JSON_EX("2","JSON转换异常"),
        PARAMS_EMPTY("5","{0}参数不能为空"),
        SQL_EX("5014","数据库异常"),
        UNKNOW_EX("5015","未知异常"),
        DATA_IS_EXIST("5027","{0}数据已存在"),
        DATA_IS_NO_EXIST("5028","{0}数据不存在"),
    
    
        /**参数校验异常码8101~8150*/
        RULE_OVER_EX("8101","rule[{0}]超出了范围!"),
        NOT_ALLOW_NULL_EX("8102","{0}不允许为空!"),
        NOT_FIT_REGULAR_EX("8103","{0}不符合正则规范!"),
        LOW_NUMBER_EX("8104","{0}超出范围,不能小于{1}!"),
        UP_NUMBER_EX("8105","{0}超出范围,不能大于{1}!"),
        MUST_STRING_TYPE_EX("8106","{0}的数据类型必须为必须为字符串!"),
        MUST_BOOLEAN_TYPE_EX("8107","{0}的数据类型必须为必须为Boolean!"),
        MUST_NUMBER_TYPE_EX("8108","{0}的数据类型必须为必须为数字!"),
        UP_PARAM_LENGTH_EX("8109","'{0}'的'{1}'数据长度超过了{2}!"),
        INSTANCE_NOT_EXIST("8110","切图实例不存在!"),
        TASK_IS_EXIST("8111","切图任务已存在,请不要重复创建!"),
        TASK_IS_NOT_EXIST("8113","切图任务不存在!"),
        TASK_CANT_CHANGE_STATUS("8112","任务状态无法执行当前操作!");
    
    
        private String code;
    
        private String msg;
    
        private ReturnCode(String value, String msg){
            this.code = value;
            this.msg = msg;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    }
  • 相关阅读:
    idea工具如何在修改jsp后不用一直重启idea
    解决端口被占用问题
    tomcat端口强制关闭
    tomcat部署方式之三(war包,也是最重要的)
    tomcat部署方式之二
    tomcat的配置方式一
    在启动tomcat时出现java_home未配置的问题(闪退)
    mysql出现“mysql不是内部或外部命令也不是可运行”
    staruml下载
    用java语言实现一个观察者模式
  • 原文地址:https://www.cnblogs.com/weihuang6620/p/13100181.html
Copyright © 2011-2022 走看看