У меня есть следующий шаблон строки: "Hello [Name] Please find attached [Invoice Number] which is due on [Due Date]"
.
У меня также есть строковые переменные для имени, номера счета и срока оплаты - как лучше всего заменить токены в шаблоне переменными?
(Обратите внимание, что если переменная содержит токен, ее НЕ следует заменять).
РЕДАКТИРОВАТЬ
Благодаря @laginimaineb и @ alan-moore, вот мое решение:
public static String replaceTokens(String text,
Map<String, String> replacements) {
Pattern pattern = Pattern.compile("\\[(.+?)\\]");
Matcher matcher = pattern.matcher(text);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
String replacement = replacements.get(matcher.group(1));
if (replacement != null) {
// matcher.appendReplacement(buffer, replacement);
// see comment
matcher.appendReplacement(buffer, "");
buffer.append(replacement);
}
}
matcher.appendTail(buffer);
return buffer.toString();
}
Ответы:
Наиболее эффективным способом было бы использовать средство сопоставления, чтобы постоянно находить выражения и заменять их, а затем добавлять текст в построитель строк:
источник
Я действительно не думаю, что вам нужно использовать для этого шаблонизатор или что-то подобное. Вы можете использовать этот
String.format
метод так:источник
К сожалению, удобный метод String.format, упомянутый выше, доступен только начиная с Java 1.5 (который в настоящее время должен быть довольно стандартным, но вы никогда не узнаете). Вместо этого вы также можете использовать Java- класс MessageFormat для замены заполнителей.
Он поддерживает заполнители в форме '{number}', поэтому ваше сообщение будет выглядеть как «Здравствуйте, {0}, пожалуйста, найдите прикрепленный {1}, который должен быть отправлен {2}». Эти строки можно легко перенести во внешний вид с помощью ResourceBundles (например, для локализации с несколькими языковыми стандартами). Замена будет производиться с использованием метода static'format класса MessageFormat:
источник
StringBuilder.append()
s, и подумал: «Конечно, есть способ получше ... что-то более питоническое ...» - и черт возьми, я думаю, этот метод может предшествовать методам форматирования Python. На самом деле ... это может быть старше 2002 года ... Я не могу найти, когда это на самом деле появилось ...Вы можете попробовать использовать библиотеку шаблонов, например Apache Velocity.
http://velocity.apache.org/
Вот пример:
Результатом будет:
источник
Вы можете использовать библиотеку шаблонов для замены сложных шаблонов.
FreeMarker - очень хороший выбор.
http://freemarker.sourceforge.net/
Но для простой задачи вам может помочь простой служебный класс.
org.apache.commons.lang3.text.StrSubstitutor
Он очень мощный, настраиваемый и простой в использовании.
Например, если вы хотите заменить системную переменную среды в строку шаблона, вот код:
источник
Вывод: Здравствуйте, присоединяйтесь! У вас 10 сообщений "
источник
Это зависит от того, где находятся фактические данные, которые вы хотите заменить. У вас может быть такая карта:
содержащий все данные, которые можно заменить. Затем вы можете перебирать карту и изменять все в строке следующим образом:
Вы также можете перебирать String и находить элементы на карте. Но это немного сложнее, потому что вам нужно проанализировать строку в поисках []. Вы можете сделать это с помощью регулярного выражения, используя Pattern и Matcher.
источник
источник
Мое решение по замене токенов стиля $ {variable} (на основе ответов здесь и Spring UriTemplate):
источник
http://github.com/niesfisch/tokenreplacer
источник
С библиотекой Apache Commons вы можете просто использовать Stringutils.replaceEach :
Из документации :
источник
К вашему сведению
В новом языке Kotlin вы можете напрямую использовать «строковые шаблоны» в исходном коде, никакая сторонняя библиотека или механизм шаблонов не должны выполнять замену переменных.
Это особенность самого языка.
См. Https://kotlinlang.org/docs/reference/basic-types.html#string-templates
источник
Раньше я решал эту проблему с помощью StringTemplate и Groovy Templates .
В конечном счете, решение использовать шаблонизатор или нет, должно основываться на следующих факторах:
Если что-либо из вышеперечисленного применимо к вашему проекту, я бы подумал об использовании механизма шаблонов, большинство из которых предоставляют эту функциональность и многое другое.
источник
я использовал
источник
Следующее заменяет переменные формы
<<VAR>>
значениями, найденными на карте. Вы можете протестировать это онлайн здесьНапример, со следующей входной строкой
и следующие значения переменных
выводит следующие
Вот код
и хотя это не требуется, вы можете использовать аналогичный подход для замены переменных в строке на свойства из вашего файла application.properties, хотя это уже может быть сделано:
источник