对两个字符串进行匹配但不匹配${}中的值且得到两个字符串中${}的值的键值对

需求:现有短信内容如:您的验证码为${123456}!,现在需要根据短信的内容与数据库表sms_template表中短信模板内容进行匹配,获取到该短信内容对应的短信模板。sms_template中短信模板内容格式为如:您的验证码为${code}!

分两种情况:1.短信内容不需要参数,即直接将短信内容和模板进行匹配。2.短信内容存在参数,先获取到短信内容中的参数值,即为${}中的值,然后将sms_template表中的内容全部读取到内存中进行匹配。

/**
     * 匹配字符串中&{*}的参数
     * @param content
     * @return
     */
    public static List<String> matchParam(final String content) {
  //      String message = "测试${日日日日二个人44ggg}通知短信${bsdbv成本和我77}";

        // 利用好其预编译功能,可以有效加快正则匹配速度
        Pattern dynamic = Pattern.compile(".*\\$\\{([\\u4E00-\\u9FA5A-Za-z0-9]+)\\}.*");
        Pattern dynamicLimitCount = Pattern.compile("\\$\\{([\\u4E00-\\u9FA5A-Za-z0-9]+)\\}");

        dynamic.matcher(content).matches();
        Set<String> paramSet = new LinkedHashSet<>();
        Matcher m = dynamicLimitCount.matcher(content);
        while (m.find()) {
            paramSet.add(m.group(1));
        }
        List<String> paramList =  new ArrayList<>(paramSet);
//        System.out.println("内容中的动态参数为:");
//        paramList.forEach(System.out::println);
        return paramList;
    }

// 解析短信内容,获取短信模板和参数列表
    private MessageVo analyseMessage(String message) {
        MessageVo messageVo = new MessageVo();
        // 先判断短信内容是否存在参数
        List<String> paramList = StringUtils.matchParam(message);
        // 短信内容不存在参数
        if(paramList.size() == 0 || paramList == null) {
            LambdaQueryWrapper<SmsTemplate> queryWrapper = new LambdaQueryWrapper();
            queryWrapper.eq(SmsTemplate::getTemplatecontent, message);
            SmsTemplate template = templateService.getOne(queryWrapper);
            messageVo.setTemplateCode(template.getTemplatecode());
            return messageVo;
        }
        // 短信内容带参数,采用将所有模板读取到内存中进行比较
        List<SmsTemplate> templateList = templateService.list();
        String newMessage = message;
        String pattern = "\\$\\{[^}]*\\}"; // 匹配${} 的表达式
        Pattern p = Pattern.compile(pattern);
        Matcher m2 = p.matcher(newMessage);
        while (m2.find()) {    // 当字符串中有匹配到 ${} 时
            String param = m2.group(0);  // {} 和里面的内容
            // 输出${} 里面的内容
            System.out.println(param.substring(2, param.length() - 1));
            // 替换 ${}里面的内容
            newMessage = newMessage.replaceFirst(param.substring(2, param.length() - 1), "");
        }

        for (SmsTemplate template : templateList) {
            String templateContent = template.getTemplatecontent();
            // 这里可以先去除两个字符串中${}的内容进行比对,然后如果匹配成功之后,获取templateContent中${}的参数
            // 再根据message中的${}的值进行比较,先判断两个的参数个数是否一致
            String newTemplateContent = templateContent;
            Matcher m = p.matcher(newTemplateContent);
            while (m.find()) {    // 当字符串中有匹配到 ${} 时
                String param = m.group(0);  // {} 和里面的内容
                // 输出${} 里面的内容
                System.out.println(param.substring(2, param.length() - 1));
                // 替换 ${}里面的内容
                newTemplateContent = templateContent.replaceFirst(param.substring(2, param.length() - 1), "");
            }
           // log.debug("数据库的短信模板内容:" + newTemplateContent);
           // log.debug("短信内容的短信模板内容:" + newMessage);
            if (newMessage.equals(newTemplateContent)) {
                messageVo.setTemplateCode(template.getTemplatecode());
                List<String> keyList = StringUtils.matchParam(templateContent);
                // 将参数和值转成key:value的形式
                int i;
                List<TemplateParamVo> templateParam = new ArrayList();
                for (i = 0; i < keyList.size(); i++) {
                    String key = keyList.get(i);
                    String value = paramList.get(i);
                    TemplateParamVo templateParamVo = new TemplateParamVo();
                    templateParamVo.setKey(key);
                    templateParamVo.setValue(value);
                    templateParam.add(templateParamVo);
                }
                messageVo.setTemplateParam(templateParam);
                break;
            }
        }
        return messageVo;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值