• java 替换字符串模板(模板渲染)


    java渲染字符串模板,也就是说在java字符串模板中设置变量字符串,使用变量去渲染指定模板中设置好的变量字符串。下面介绍4种替换模板方式:

    1、使用内置String.format

    String message = String.format("您好%s,晚上好!您目前余额:%.2f元,积分:%d", "张三", 10.155, 10);
    System.out.println(message);
    //您好张三,晚上好!您目前余额:10.16元,积分:10

    2、使用内置MessageFormat 

    String message = MessageFormat.format("您好{0},晚上好!您目前余额:{1,number,#.##}元,积分:{2}", "张三", 10.155, 10);
    System.out.println(message);
    //您好张三,晚上好!您目前余额:10.16元,积分:10

    3、使用自定义封装 

    。。。。。
    private static Matcher m = Pattern.compile("\$\{\w+\}").matcher(template);
    。。。。。

    public
    static String processTemplate(String template, Map<String, Object> params){ StringBuffer sb = new StringBuffer(); while (m.find()) { String param = m.group(); Object value = params.get(param.substring(2, param.length() - 1)); m.appendReplacement(sb, value==null ? "" : value.toString()); } m.appendTail(sb); return sb.toString(); } public static void main(String[] args){ Map map = new HashMap(); map.put("name", "张三"); map.put("money", String.format("%.2f", 10.155)); map.put("point", 10); message = processTemplate("您好${name},晚上好!您目前余额:${money}元,积分:${point}", map); System.out.println(message); //您好张三,晚上好!您目前余额:10.16元,积分:10 }


    4、使用模板引擎freemarker
     

    首先引入freemarker.jar,这里以2.3.23版本为例,如果使用maven的配置pom.xml

    <dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.23</version>
    </dependency>
    try {
        map = new HashMap();
        map.put("name", "张三");
        map.put("money", 10.155);
        map.put("point", 10);
        Template template = new Template("strTpl", "您好${name},晚上好!您目前余额:${money?string("#.##")}元,积分:${point}", new Configuration(new Version("2.3.23")));
        StringWriter result = new StringWriter();
        template.process(map, result);
        System.out.println(result.toString());
        //您好张三,晚上好!您目前余额:10.16元,积分:10
    }catch(Exception e){
        e.printStackTrace();
    }
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.Version;
     
    import java.io.StringWriter;
    import java.text.MessageFormat;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    /**
     * Created by cxq on 2018-01-07.
     */
    public class Tpl {
     
        public static Configuration cfg;
     
        static {
            cfg = new Configuration(new Version("2.3.23"));
        }
     
        public static void main(String[] args) {
            Object[] obj = new Object[]{"张三", String.format("%.2f", 10.155), 10};
            System.out.println(processFormat("您好%s,晚上好!您目前余额:%s元,积分:%d", obj));
            System.out.println(processMessage("您好{0},晚上好!您目前余额:{1}元,积分:{2}", obj));
     
            Map map = new HashMap();
            map.put("name", "张三");
            map.put("money", String.format("%.2f", 10.155));
            map.put("point", 10);
            System.out.println(processTemplate("您好${name},晚上好!您目前余额:${money}元,积分:${point}", map));
            System.out.println(processFreemarker("您好${name},晚上好!您目前余额:${money}元,积分:${point}", map));
        }
     
        /**
         * String.format渲染模板
         * @param template 模版
         * @param params   参数
         * @return
         */
        public static String processFormat(String template, Object... params) {
            if (template == null || params == null)
                return null;
            return String.format(template, params);
        }
     
        /**
         * MessageFormat渲染模板
         * @param template 模版
         * @param params   参数
         * @return
         */
        public static String processMessage(String template, Object... params) {
            if (template == null || params == null)
                return null;
            return MessageFormat.format(template, params);
        }
     
        /**
         * 自定义渲染模板
         * @param template 模版
         * @param params   参数
         * @return
         */
        public static String processTemplate(String template, Map<String, Object> params) {
            if (template == null || params == null)
                return null;
            StringBuffer sb = new StringBuffer();
            Matcher m = Pattern.compile("\$\{\w+\}").matcher(template);
            while (m.find()) {
                String param = m.group();
                Object value = params.get(param.substring(2, param.length() - 1));
                m.appendReplacement(sb, value == null ? "" : value.toString());
            }
            m.appendTail(sb);
            return sb.toString();
        }
     
        /**
         * Freemarker渲染模板
         * @param template 模版
         * @param params   参数
         * @return
         */
        public static String processFreemarker(String template, Map<String, Object> params) {
            if (template == null || params == null)
                return null;
            try {
                StringWriter result = new StringWriter();
                Template tpl = new Template("strTpl", template, cfg);
                tpl.process(params, result);
                return result.toString();
            } catch (Exception e) {
                return null;
            }
        }
     
    }

    综合,完整示例:

    http://www.weizhixi.com/user/index/article/id/53.html

    /** 
        * 简单实现${}模板功能 
        * 如${aa} cc ${bb} 其中 ${aa}, ${bb} 为占位符. 可用相关变量进行替换 
        * @param templateStr 模板字符串 
        * @param data     替换的变量值 
        * @param defaultNullReplaceVals  默认null值替换字符, 如果不提供, 则为字符串"" 
        * @return 返回替换后的字符串, 如果模板字符串为null, 则返回null 
        */  
          
    @SuppressWarnings("unchecked")  
    public static String simpleTemplate(String templateStr, Map<String, ?> data, String... defaultNullReplaceVals) {  
        if(templateStr == null) return null;  
          
        if(data == null) data = Collections.EMPTY_MAP;  
              
        String nullReplaceVal = defaultNullReplaceVals.length > 0 ? defaultNullReplaceVals[0] : "";  
        Pattern pattern = Pattern.compile("\$\{([^}]+)}");  
              
        StringBuffer newValue = new StringBuffer(templateStr.length());  
      
        Matcher matcher = pattern.matcher(templateStr);  
      
        while (matcher.find()) {  
            String key = matcher.group(1);  
            String r = data.get(key) != null ? data.get(key).toString() : nullReplaceVal;  
            matcher.appendReplacement(newValue, r.replaceAll("\\", "\\\\")); //这个是为了替换windows下的文件目录在java里用\表示  
        }  
      
        matcher.appendTail(newValue);  
      
        return newValue.toString();  
    }  
      
    //测试方法    
    public static void main(String[] args) {  
        String tmpLine = "简历:
     姓名: ${姓} ${名} 
     性别: ${性别}
     年龄: ${年龄} 
    ";  
        Map<String, Object> data = new HashMap<String, Object>();  
        data.put("姓", "wen");  
        data.put("名", "66");  
        data.put("性别", "man");  
        data.put("年龄", "222");  
              
        System.out.println(simpleTemplate(tmpLine, null, "--"));  
    }  

    http://wen66.iteye.com/blog/830526

    static final String jsonStr = "{"name":"11","time":"2014-10-21"}";
    static final String template = "亲爱的用户${name},你好,上次登录时间为${time}";
    
    static String generateWelcome(String jsonStr,String template){
        Gson gson = new Gson();
        HashMap jsonMap = gson.fromJson(jsonStr, HashMap.class);
        for (Object s : jsonMap.keySet()) {
            template = template.replaceAll("\$\{".concat(s.toString()).concat("\}")
                    , jsonMap.get(s.toString()).toString());
        }
        return template;
    }
    
    public static void main(String[] args) throws IOException {
        System.out.println(generateWelcome(jsonStr,template));
    }

    https://segmentfault.com/q/1010000002484866

    在开发中类似站内信的需求时,我们经常要使用字符串模板,比如

    尊敬的用户${name}。。。。
    

    里面的${name}就可以替换为用户的用户名。

    下面使用正则表达式简单实现一下这个功能:

    /**
         * 根据键值对填充字符串,如("hello ${name}",{name:"xiaoming"})
         * 输出:
         * @param content
         * @param map
         * @return
         */
        public static String renderString(String content, Map<String, String> map){
            Set<Entry<String, String>> sets = map.entrySet();
            for(Entry<String, String> entry : sets) {
                String regex = "\$\{" + entry.getKey() + "\}";
                Pattern pattern = Pattern.compile(regex);
                Matcher matcher = pattern.matcher(content);
                content = matcher.replaceAll(entry.getValue());
            }
            return content;
        }

    在map里存储了键值对,然后获取键值对的集合,遍历集合进行对字符串的渲染

    测试:

        @Test
        public void renderString() {
            String content = "hello ${name}, 1 2 3 4 5 ${six} 7, again ${name}. ";
            Map<String, String> map = new HashMap<>();
            map.put("name", "java");
            map.put("six", "6");
            content = StringHelper.renderString(content, map);
            System.out.println(content);
        }

    有两个变量需要替换,name和six,对应的值分别为java和6,同时name调用了两次。

    结果:

    hello java, 1 2 3 4 5 6 7, again java. 

     http://www.zgljl2012.com/javazheng-ze-biao-da-shi-shi-xian-name-xing-shi-de-zi-fu-chuan-mo-ban/

  • 相关阅读:
    iOS 中使用 XIB 自定义cell的两种方法以及编译出现常见 的错误 (xcode6.0之后)
    iOS中 学会如何对sqlite3 进行封装
    杭电ACM2012素数判定
    杭电ACM2503a/b+c/d
    杭电ACM2005第几天
    杭电ACM2034人见人爱AB
    杭电ACM2502月之数
    杭电ACM2001计算两点间的距离
    杭电ACM2002计算求得体积
    杭电ACM2033人见人爱A+B
  • 原文地址:https://www.cnblogs.com/softidea/p/9140204.html
Copyright © 2020-2023  润新知