Как создать динамическую строку шаблона
Есть ли какой-либо API, который заменяет строку шаблона вместе со значениями, используя Spring или Java.
Например:
Dear %FIRST_NAME% %LAST_NAME%,
---- remaining text-----------
где параметры (FIRST_NAME
, LAST_NAME
в форме Map
,
4 ответа
Мой любимый шаблонизатор Apache Velocity
Также хорошо интегрируется с Spring, здесь есть вступительная статья
Это относительно просто написать код, который будет делать это. Если это то, что вы собираетесь делать много, однако вы можете захотеть использовать существующую библиотеку, такую как Velocity. Однако он использует другой синтаксис для значений. Смотрите Начало работы.
Если вы хотите написать это сами, попробуйте:
public static String replaceAll(String text, Map<String, String> params) {
return replaceAll(text, params, '%', '%');
}
public static String replaceAll(String text, Map<String, String> 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<String, String> params = new HashMap<String, String>();
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<String>() {
@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;
}