Замена строк в Java: аналог функционала Velocity Template

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

При работе с заменой строк в Java вы можете воспользоваться классами Pattern и Matcher. Их использование позволяет находить совпадения с помощью регулярных выражений и осуществлять замену на значения из словаря.

Java
Скопировать код
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);
    }
}

Данный код представляет собой быстрое и надёжное решение для замены плейсхолдеров без использования сторонних библиотек.

Кинга Идем в IT: пошаговый план для смены профессии

Разведка: изучаем возможности

Apache Commons Text: помощник извне

Для обеспечения более высокого уровня абстракции вы можете обратиться к Apache Commons Text и его классу StringSubstitutor:

xml
Скопировать код
<!-- Добавьте эту зависимость в ваш pom.xml -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.9</version> <!-- Следите за обновлениями версий -->
</dependency>

Пример простого использования субститутора:

Java
Скопировать код
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: национальный контраргумент

Также доступны и внутренние средства, не уступающие внешним:

Java
Скопировать код
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: зеркальное отражение

Благодаря рефлексии вы можете изящно подставлять значения из полей объекта:

Java
Скопировать код
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()

Этот метод полезен в простых случаях:

Java
Скопировать код
String result = String.format("Привет, %s!", "Мультивселенная");
System.out.println(result); // Вывод: Привет, Мультивселенная!

Гибкий путь: Regex и класс Matcher

Для сложных задач замены данные инструменты идеально подойдут:

Java
Скопировать код
Pattern pattern = Pattern.compile("Привет, (\\w+)!");
Matcher matcher = pattern.matcher("Привет, Regex!"); 
if (matcher.matches()) {
    System.out.println("Найдено совпадение: " + matcher.group(1)); // Вывод: Найдено совпадение: Regex
}

Структурированный подход: Читабельность кода и его структура

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

Поза горизонтомы строковой замены

Управление специфичными ситуациями

Не забывайте обеспечивать безопасность специальных символов и учитывать возможность появления значений null:

Java
Скопировать код
String escapedReplacement = Matcher.quoteReplacement(value);
matcher.appendReplacement(result, escapedReplacement);

Ловушка производительности

Следите за производительностью при обработке больших объемов текста и при выполнении частых замен.

Совместимость: Антиципация

Важно разумно учесть совместимость с разными версиями Java и выбирать API, доступные в более старых версиях.

Полезные материалы

  1. Замена строк в Java: альтернатива шаблонам Velocity – Stack Overflow — Ассорти советов по замене строковых шаблонов в Java.
  2. String (Java Platform SE 7) — Официальная документация по методу replaceAll.
  3. StrSubstitutor (Apache Commons Lang 3.14.0 API) — Описание StrSubstitutor от Apache Commons Lang.
  4. Примеры форматирования строк в Java: издание 2021 года – DZone — Образцы и руководства по форматированию строк в Java.
  5. Движок шаблонов FreeMarker для Java — Официальный сайт FreeMarker, сильная альтернатива для создания шаблонов.
  6. Thymeleaf — Современный серверный движок шаблонов Java для веб-разработки.
Свежие материалы