Есть ли String
в Java механизм замены, где я могу передавать объекты с текстом, и он заменяет строку по мере ее появления.
Например, текст такой:
Hello ${user.name},
Welcome to ${site.name}.
У меня есть предметы "user"
и "site"
. Я хочу заменить строки, указанные внутри, ${}
эквивалентными значениями из объектов. Это то же самое, что мы заменяем объекты в шаблоне скорости.
String.format("Hello %s", username);
Hello ${user.name}
, а не похожаHello %s
илиHello {0}
.Ответы:
Используйте
StringSubstitutor
из текста Apache Commons.https://commons.apache.org/proper/commons-text/
Он сделает это за вас (и его открытый исходный код ...)
источник
Map<String, String> valuesMap = new HashMap<String, String>();
.StrSubstitutor
теперь устарела в https://commons.apache.org/proper/commons-lang/ . Пользователь https://commons.apache.org/proper/commons-text/ вместо этогоStrSubstitutor
устарело с 1.3, используйтеStringSubstitutor
вместо него. Этот класс будет удален в 2.0. Gradle зависимость для импортированияStringSubstitutor
являетсяorg.apache.commons:commons-text:1.4
Взгляните на
java.text.MessageFormat
класс: MessageFormat принимает набор объектов, форматирует их, а затем вставляет отформатированные строки в шаблон в соответствующих местах.источник
format
вObject...
виду, также принимает varargs, поэтому вы можете использовать этот более сжатый синтаксис там, где это предпочтительнееformat("{0} world {1}", "Hello", "!");
MessageFormat
можно надежно использовать только для его тезки, отображения сообщений, а не для вывода, когда имеет значение техническое форматирование. Например, числа будут отформатированы в соответствии с настройками локали, что сделает их недействительными для технических целей.Я предпочитаю,
String.format()
потому что это один лайнер и не требует сторонних библиотек:Я использую это регулярно, например, в сообщениях об исключениях, например:
Подсказка: вы можете ввести столько переменных, сколько захотите, потому что
format()
использует Varargsисточник
String.format("Hello! My name is %s, I'm %s. Why is my name %s you ask? Well I'm only %s years old so I don't know", name, age, name, age);
. Другие ответы здесь требуют указания каждого аргумента только один раз.String.format("Hello! My name is %1$s, I'm %2$s. Why is my name %1$s you ask? Well I'm only %2$s years old so I don't know", name, age)
Я собрал небольшую тестовую реализацию этого. Основная идея - позвонить
format
и передать строку формата, карту объектов и имена, которые они имеют локально.Результатом будет следующее:
Примечание: это не компилируется из-за необработанных исключений. Но это значительно упрощает чтение кода.
Кроме того, мне не нравится, что вы должны сами создавать карту в коде, но я не знаю, как получить имена локальных переменных программно. Лучший способ сделать это - не забыть поместить объект на карту сразу после его создания.
Следующий пример дает результаты, которые вы хотите получить из своего примера:
Я также должен упомянуть, что я понятия не имею, что такое скорость, поэтому я надеюсь, что этот ответ актуален.
источник
Вот схема того, как вы могли бы это сделать. Реализовать его как реальный код должно быть относительно просто.
user.name
стал быuser
иname
. Посмотритеuser
на карту, чтобы получить объект, и используйте отражение, чтобы получить значениеname
от объекта. Предполагая, что у ваших объектов есть стандартные геттеры, вы будете искать методgetName
и вызывать его.источник
Есть несколько реализаций Expression Language, которые делают это за вас, может быть предпочтительнее использовать вашу собственную реализацию по мере роста ваших требований, см., Например, JUEL и MVEL
Мне нравится и я успешно использовал MVEL как минимум в одном проекте.
Также см. Сообщение Stackflow JSTL / JSP EL (язык выражений) в контексте, отличном от JSP (автономный).
источник
Нет ничего стандартного, что можно было бы сравнить со скоростью, поскольку скорость была написана для решения именно этой задачи. Самое близкое, что вы можете попробовать, - это заглянуть в Formatter.
http://cupi2.uniandes.edu.co/site/images/recursos/javadoc/j2se/1.5.0/docs/api/java/util/Formatter.html
Однако, насколько мне известно, средство форматирования было создано для предоставления C-подобных параметров форматирования в Java, поэтому он может не совсем поцарапать ваш зуд, но вы можете попробовать :).
источник
Я использую GroovyShell в java для синтаксического анализа шаблона с помощью Groovy GString:
источник