Как создать динамическую строку шаблона

Есть ли какой-либо 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;
}
Другие вопросы по тегам