Замена строк в Java: аналог функционала Velocity Template
Быстрый ответ
При работе с заменой строк в Java вы можете воспользоваться классами Pattern
и Matcher
. Их использование позволяет находить совпадения с помощью регулярных выражений и осуществлять замену на значения из словаря.
import java.util.regex.*;
import java.util.*;
public class TemplateReplacer {
public static String replace(String template, Map<String, String> values) {
Matcher matcher = Pattern.compile("\\$\\{(.+?)\\}").matcher(template);
StringBuffer result = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(result, values.getOrDefault(matcher.group(1), "NoValue"));
}
return matcher.appendTail(result).toString();
}
public static void main(String[] args) {
String result = replace("Привет, ${name}!", Map.of("name", "Мир"));
System.out.println(result);
}
}
Данный код представляет собой быстрое и надёжное решение для замены плейсхолдеров без использования сторонних библиотек.
Разведка: изучаем возможности
Apache Commons Text: помощник извне
Для обеспечения более высокого уровня абстракции вы можете обратиться к Apache Commons Text и его классу StringSubstitutor
:
<!-- Добавьте эту зависимость в ваш pom.xml -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version> <!-- Следите за обновлениями версий -->
</dependency>
Пример простого использования субститутора:
import org.apache.commons.text.StringSubstitutor;
Map<String, String> values = Map.of("name", "Алиса");
StringSubstitutor substitutor = new StringSubstitutor(values);
String result = substitutor.replace("Привет, ${name}!");
System.out.println(result); // Вывод: Привет, Алиса!
MessageFormat: национальный контраргумент
Также доступны и внутренние средства, не уступающие внешним:
import java.text.MessageFormat;
public class TemplateFormatter {
public static String format(String pattern, Object... arguments) {
return MessageFormat.format(pattern, arguments);
}
public static void main(String[] args) {
String result = format("Привет, {0}!", "Земля");
System.out.println(result); // Вывод: Привет, Земля!
}
}
Reflection: зеркальное отражение
Благодаря рефлексии вы можете изящно подставлять значения из полей объекта:
import java.lang.reflect.Field;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ReflectiveReplacer {
public static String replace(String template, Object data) throws IllegalAccessException {
Matcher matcher = Pattern.compile("\\$\\{(.+?)\\}").matcher(template);
StringBuffer result = new StringBuffer();
while (matcher.find()) {
String placeholder = matcher.group(1);
Field field = data.getClass().getDeclaredField(placeholder);
field.setAccessible(true);
Object value = field.get(data);
matcher.appendReplacement(result, value.toString());
}
return matcher.appendTail(result).toString();
}
}
Однако учитывайте влияние рефлексии на производительность и безопасность.
Визуализация
Представьте себе инструменты для замены текста как элементы набора, который позволяет создавать уникальное сообщение. Воспользуйтесь ими так же, как вы бы воспользовались подходящим инструментом из ящика инструментов.
Простой путь: использование String.format()
Этот метод полезен в простых случаях:
String result = String.format("Привет, %s!", "Мультивселенная");
System.out.println(result); // Вывод: Привет, Мультивселенная!
Гибкий путь: Regex и класс Matcher
Для сложных задач замены данные инструменты идеально подойдут:
Pattern pattern = Pattern.compile("Привет, (\\w+)!");
Matcher matcher = pattern.matcher("Привет, Regex!");
if (matcher.matches()) {
System.out.println("Найдено совпадение: " + matcher.group(1)); // Вывод: Найдено совпадение: Regex
}
Структурированный подход: Читабельность кода и его структура
Для удобства обслуживания кода в будущем используйте осмысленные имена переменных и структурированные классы.
Поза горизонтомы строковой замены
Управление специфичными ситуациями
Не забывайте обеспечивать безопасность специальных символов и учитывать возможность появления значений null:
String escapedReplacement = Matcher.quoteReplacement(value);
matcher.appendReplacement(result, escapedReplacement);
Ловушка производительности
Следите за производительностью при обработке больших объемов текста и при выполнении частых замен.
Совместимость: Антиципация
Важно разумно учесть совместимость с разными версиями Java и выбирать API, доступные в более старых версиях.
Полезные материалы
- Замена строк в Java: альтернатива шаблонам Velocity – Stack Overflow — Ассорти советов по замене строковых шаблонов в Java.
- String (Java Platform SE 7) — Официальная документация по методу
replaceAll
. - StrSubstitutor (Apache Commons Lang 3.14.0 API) — Описание StrSubstitutor от Apache Commons Lang.
- Примеры форматирования строк в Java: издание 2021 года – DZone — Образцы и руководства по форматированию строк в Java.
- Движок шаблонов FreeMarker для Java — Официальный сайт FreeMarker, сильная альтернатива для создания шаблонов.
- Thymeleaf — Современный серверный движок шаблонов Java для веб-разработки.