Как создать динамическую строку шаблона - PullRequest
0 голосов
/ 03 марта 2010

Есть ли какой-либо API, который заменяет строку шаблона вместе со значениями, используя Spring или java.

Например:

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

где параметры (FIRST_NAME, LAST_NAME)форма Map.

Ответы [ 4 ]

2 голосов
/ 03 марта 2010

Это относительно просто написать код, который будет делать это. Если это то, что вы собираетесь делать много, вы можете использовать существующую библиотеку типа 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.
0 голосов
/ 07 августа 2015

Использование:

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;
}
0 голосов
/ 03 марта 2010

Мой любимый движок шаблонов - Apache Velocity

Прекрасно интегрируется и с Spring, вот вступительная статья здесь

0 голосов
/ 03 марта 2010

Проверьте StringTemplate, http://www.stringtemplate.org/ и статью здесь, чтобы прочувствовать это, http://www.codecapers.com/post/Generating-Structured-Text-with-StringTemplate.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...