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

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

1、使用内置String.format

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

2、使用内置MessageFormat

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

3、使用自定义封装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public  static  String processTemplate(String template, Map<String, Object> params){
     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();
}
 
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

1
2
3
4
5
< dependency >
   < groupId >org.freemarker</ groupId >
   < artifactId >freemarker</ artifactId >
   < version >2.3.23</ version >
</ dependency >
1
2
3
4
5
6
7
8
9
10
11
12
13
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();
}

综合,完整示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package  com.weizhixi.util;
 
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 = "简历:\n 姓名: ${姓} ${名} \n 性别: ${性别}\n 年龄: ${年龄} \n";  
    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/

猜你喜欢

转载自www.cnblogs.com/softidea/p/9140204.html