需求:现有短信内容如:您的验证码为${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;
}