栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java解析{{}}变量名以及文本内容替换操作

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java解析{{}}变量名以及文本内容替换操作

发短信、发邮件的时候经常会遇到模板内容需要替换成实际数据的问题,本文介绍从文本模板中解析出变量列表,以及参数填入后得到实际文本内容的办法:


public static List getParams(String pattern, String content) {
 Pattern p = Pattern.compile(pattern);
 Matcher m = p.matcher(content);
 
 List result = new ArrayList();
 while (m.find()) {
  result.add(m.group(1));
 }
 return result;
}
 

public static String parse(String pattern, String content, Map data) {
 Pattern p = Pattern.compile(pattern);
 Matcher m = p.matcher(content);
 
 StringBuffer sb = new StringBuffer();
 while (m.find()) {
  String key = m.group(1);
  String value = data.get(key);
  m.appendReplacement(sb, value == null ? "" : value);
 }
 m.appendTail(sb);
 return sb.toString();
}
 
public static void main(String[] args) {
 String content = "恭喜{{姓名}}报名成功,请凭报名编号{[code]}到现场参加活动";
 String reg = "\{\{(.+?)\}\}";
 List params = getParams(reg, content);
 System.out.println(params);
 
 Map data = new HashMap();
 data.put("姓名", "张三丰");
 data.put("code", "930118");
 String text = parse(reg, content, data);
 System.out.println(text);
}

上面的代码介绍的是针对{{}}形式的变量值的解析办法,大家可以修改一下正则表达式,改成可以解析${}变量的办法

补充知识:java模板字符串优雅解析(占位符解析)

项目中常常需要解析字符串模板,比如user:{userId}:{userType}用于redis的key等,比较常见的做法就是使用String.format(“user:%s:%s”, 1, 1)方法,但个人感觉那样的模板不够明了,而使用模板解析器可更好地有助于解析此类字符串。

可使用map用于解析,也可使用对象进行解析,也可使用类似String.format可变参数进行解析,多样化解析对象值。有点类似于js的模板字符串${}。

也可自定义前缀后缀进行解析。如PlaceholderResolver.getResolver("{", “}”)该对象可解析{}该类型的占位符.

性能方面:

PlaceholderResolve解析结果

String.format解析结果

解析100w次,占位符解析比String.format平均都会快个0.4~0.5s,so 性能应该问题不大。最主要的是不需要调用太多的对象方法,自动解析,方便快捷。

源代码如下:


public class PlaceholderResolver {
 
 public static final String DEFAULT_PLACEHOLDER_PREFIX = "${";

 
 public static final String DEFAULT_PLACEHOLDER_SUFFIX = "}";

 
 private static PlaceholderResolver defaultResolver = new PlaceholderResolver();

 
 private String placeholderPrefix = DEFAULT_PLACEHOLDER_PREFIX;

 
 private String placeholderSuffix = DEFAULT_PLACEHOLDER_SUFFIX;


 private PlaceholderResolver(){}

 private PlaceholderResolver(String placeholderPrefix, String placeholderSuffix) {
  this.placeholderPrefix = placeholderPrefix;
  this.placeholderSuffix = placeholderSuffix;
 }

 
 public static PlaceholderResolver getDefaultResolver() {
  return defaultResolver;
 }

 public static PlaceholderResolver getResolver(String placeholderPrefix, String placeholderSuffix) {
  return new PlaceholderResolver(placeholderPrefix, placeholderSuffix);
 }

 
 public String resolve(String content, String... values) {
  int start = content.indexOf(this.placeholderPrefix);
  if (start == -1) {
   return content;
  }
  //值索引
  int valueIndex = 0;
  StringBuilder result = new StringBuilder(content);
  while (start != -1) {
   int end = result.indexOf(this.placeholderSuffix);
   String replaceContent = values[valueIndex++];
   result.replace(start, end + this.placeholderSuffix.length(), replaceContent);
   start = result.indexOf(this.placeholderPrefix, start + replaceContent.length());
  }
  return result.toString();
 }

 
 public String resolve(String content, Object[] values) {
  return resolve(content, Stream.of(values).map(String::valueOf).toArray(String[]::new));
 }

 
 public String resolveByRule(String content, Function rule) {
  int start = content.indexOf(this.placeholderPrefix);
  if (start == -1) {
   return content;
  }
  StringBuilder result = new StringBuilder(content);
  while (start != -1) {
   int end = result.indexOf(this.placeholderSuffix, start);
   //获取占位符属性值,如${id}, 即获取id
   String placeholder = result.substring(start + this.placeholderPrefix.length(), end);
   //替换整个占位符内容,即将${id}值替换为替换规则回调中的内容
   String replaceContent = placeholder.trim().isEmpty() ? "" : rule.apply(placeholder);
   result.replace(start, end + this.placeholderSuffix.length(), replaceContent);
   start = result.indexOf(this.placeholderPrefix, start + replaceContent.length());
  }
  return result.toString();
 }

 
 public String resolveByMap(String content, final Map valueMap) {
  return resolveByRule(content, placeholderValue -> String.valueOf(valueMap.get(placeholderValue)));
 }

 
 public String resolveByProperties(String content, final Properties properties) {
  return resolveByRule(content, placeholderValue -> properties.getProperty(placeholderValue));
 }

 
 public String resolveByObject(String content, final Object obj) {
  if (obj instanceof Map) {
   return resolveByMap(content, (Map)obj);
  }
  return resolveByRule(content, placeholderValue -> String.valueOf(ReflectionUtils.getValueByFieldPath(obj, placeholderValue)));
 }
}

由于代码还有一些工具类的调用因为篇幅问题没有贴,如有需要可以去 https://gitee.com/objs/mayfly 该项目中获取

以上这篇java解析{{}}变量名以及文本内容替换操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/131562.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号