zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    word设置的密码忘了怎么办?
    Navicat Report Viewer 设置 HTTP 的方法
    如何处理Navicat Report Viewer 报表
    excel密码忘记了怎么办
    Beyond Compare文本比较搜索功能详解
    Popular Cows POJ
    Problem B. Harvest of Apples HDU
    网络流模型整理
    The Shortest Statement CodeForces
    Vasya and Multisets CodeForces
  • 原文地址:https://www.cnblogs.com/softidea/p/9140204.html
Copyright © 2011-2022 走看看