05月23, 2018

自定义模版字符串解析

自定义模版字符串解析

有时候需要拼接一些字符串,在Java有字符串模版,但是这个模版的可读性很差,js在ES6中新增了字符模版,但是在面对模版字符串的时候依旧无法处理。所以写了个工具在两端可以解析同一套模版。

String name = "张三";
int age = 18;
String temp = "%s您好!你的年龄%s"//Java字符串模版

// 改成模版字符串时可读性比较好
var temp = "${name}您好!你的年龄${age}"//通用模版字符串写法

var context = "张三您好!你的年龄18";//最终需要的结果
var name = "张三";
var age = 18;

var tempStr = `${name}您好!你的年龄${age}`//ES6自带字符串模版

var temp = "${name}您好!你的年龄${age}"//通用模版字符串写法

var context = "张三您好!你的年龄18";//最终需要的结果

Java版

/**
 * 字符串模版解析工具
 * @author wpy
 */
public class StringTemplateUtils {

    /**
     * 使用${表示变量}
     */
    private static final String DEF_REGEX="\\$\\{(.+?)\\}";

    /**
     * 渲染 ${value} 表示变量的字符串模版
     * @param template 字符串模版
     * @param data 需要替换的键值对
     * @return 渲染后的字符串
     */
    public static String render(String template, Map<String, String> data) {
        return render(template,data,DEF_REGEX);
    }

    /**
     * 渲染 regex 表示变量的字符串模版
     * @param template 字符串模版
     * @param data 需要替换的键值对
     * @param regex 变量正则
     * @return 渲染后的字符串
     */
    public static String render(String template, Map<String, String> data,String regex) {
        if(StringUtils.isBlank(template)){
            return "";
        }
        if(StringUtils.isBlank(regex)){
            return template;
        }
        if(data == null || data.size() == 0){
            return template;
        }
        try {
            StringBuffer sb = new StringBuffer();
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(template);
            while (matcher.find()) {
                // 键名
                String name = matcher.group(1);
                // 键值
                String value = data.get(name);
                if (value == null) {value = "";}
                matcher.appendReplacement(sb, value);
            }
            matcher.appendTail(sb);
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return template;

    }
}

javascript 版

function render(template, context, tokenReg) {
  if (!tokenReg) {
    tokenReg = /(\\)?\$\{([^\{\}\\]+)(\\)?\}/g;
  }
  return template.replace(tokenReg, function (word, slash1, token, slash2) {
    if (slash1 || slash2) {
      return word.replace('\\', '');
    }

    let variables = token.replace(/\s/g, '').split('.');
    let currentObject = context;
    let i, length, variable;

    for (i = 0, length = variables.length, variable = variables[i]; i < length; ++i) {
      currentObject = currentObject[variable];
      if (currentObject === undefined || currentObject === null) return '';
    }

    return currentObject;
  })
}

本文链接:https://www.qiangshuidiyu.xin/post/string-template.html

-- EOF --

Comments