如何创建动态模板字符串

是否有任何API使用Spring或java替换模板字符串以及值。

例如:

Dear %FIRST_NAME% %LAST_NAME%, ---- remaining text----------- 

其中参数( FIRST_NAMELAST_NAME )以Map的forms出现。

我最喜欢的模板引擎是Apache Velocity

与Spring完美整合, 这里有一篇介绍性文章

编写执行此操作的代码相对简单。 如果这是你要做的事情,那么你可能想要使用像Velocity这样的现有库。 但是它对值使用不同的语法。 请参阅“ 入门” 。

如果你想自己写这个,试试:

 public static String replaceAll(String text, Map params) { return replaceAll(text, params, '%', '%'); } public static String replaceAll(String text, Map params, char leading, char trailing) { String pattern = ""; if (leading != 0) { pattern += leading; } pattern += "(\\w+)"; if (trailing != 0) { pattern += trailing; } Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(text); boolean result = m.find(); if (result) { StringBuffer sb = new StringBuffer(); do { String replacement = params.get(m.group(1)); if (replacement == null) { replacement = m.group(); } m.appendReplacement(sb, replacement); result = m.find(); } while (result); m.appendTail(sb); return sb.toString(); } return text; } 

例如:

 String in = "Hi %FIRST_NAME% %LAST_NAME%."; Map params = new HashMap(); params.put("FIRST_NAME", "John"); params.put("LAST_NAME", "Smith"); String out = replaceAll(in, params); System.out.println(out); 

输出:

 Hi John Smith. 

检查StringTemplate, http://www.stringtemplate.org/和文章,了解它, http://www.codecapers.com/post/Generating-Structured-Text-with-StringTemplate.aspx

用法:

 replaceAll(string, "param1", "value 1", "param12", "value 12"); 

执行:

 public static String replaceAll(String text, Object... replacements) { Assert.isTrue(replacements.length % 2 == 0, "Is not key - value pairs: " + replacements); Map< String, String> longToShortNamesMap = new TreeMap<>(new Comparator() { @Override public int compare(String o1, String o2) { return o1.length() == o2.length() ? o1.compareTo(o2) : o2.length() - o1.length(); } }); for (int i = 0; i < replacements.length; i += 2) { longToShortNamesMap.put(Objects.toString(replacements[i]), Objects.toString(replacements[i+1])); } String result = text; for (String key : longToShortNamesMap.keySet()) { Assert.isTrue(text.contains(key), "Can not find key in the text " + key); result = result.replaceAll(key, longToShortNamesMap.get(key)); } return result; }