如何创建动态模板字符串
是否有任何API使用Spring或java替换模板字符串以及值。
例如:
Dear %FIRST_NAME% %LAST_NAME%, ---- remaining text-----------
其中参数( FIRST_NAME
, LAST_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; }