Как заменить набор токенов в строке Java? - PullRequest
102 голосов
/ 06 июня 2009

У меня есть следующий шаблон строки: "Hello [Name] Please find attached [Invoice Number] which is due on [Due Date]".

У меня также есть строковые переменные для имени, номера счета и срока оплаты - как лучше заменить токены в шаблоне переменными?

(Обратите внимание, что если переменная содержит токен, ее НЕ следует заменять).


EDIT

Благодаря @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();
}

Ответы [ 14 ]

1 голос
/ 04 октября 2010
0 голосов
/ 20 января 2017

В библиотеке Apache Commons вы можете просто использовать Stringutils.replaceEach :

public static String replaceEach(String text,
                             String[] searchList,
                             String[] replacementList)

Из документации :

Заменяет все вхождения строк в другой строке.

Пустая ссылка, переданная этому методу, является неактивной или, если она есть, строка "или" строка для замены "равна нулю, эта замена будет игнорироваться. Это не повторится. Для повторяющихся замен звоните перегруженным способ.

 StringUtils.replaceEach(null, *, *)        = null

  StringUtils.replaceEach("", *, *)          = ""

  StringUtils.replaceEach("aba", null, null) = "aba"

  StringUtils.replaceEach("aba", new String[0], null) = "aba"

  StringUtils.replaceEach("aba", null, new String[0]) = "aba"

  StringUtils.replaceEach("aba", new String[]{"a"}, null)  = "aba"

  StringUtils.replaceEach("aba", new String[]{"a"}, new String[]{""})  = "b"

  StringUtils.replaceEach("aba", new String[]{null}, new String[]{"a"})  = "aba"

  StringUtils.replaceEach("abcde", new String[]{"ab", "d"}, new String[]{"w", "t"})  = "wcte"
  (example of how it does not repeat)

StringUtils.replaceEach("abcde", new String[]{"ab", "d"}, new String[]{"d", "t"})  = "dcte"
0 голосов
/ 05 января 2011

Я использовал

String template = "Hello %s Please find attached %s which is due on %s";

String message = String.format(template, name, invoiceNumber, dueDate);
0 голосов
/ 06 июня 2009

В прошлом я решал эту проблему с StringTemplate и Groovy Templates .

В конечном итоге решение об использовании шаблонизатора или нет должно основываться на следующих факторах:

  • У вас будет много таких шаблонов в приложении?
  • Вам нужна возможность изменять шаблоны без перезапуска приложения?
  • Кто будет поддерживать эти шаблоны? Java-программист или бизнес-аналитик, участвующий в проекте?
  • Вам понадобится возможность добавлять логику в свои шаблоны, например, условный текст, основанный на значениях переменных?
  • Вам понадобится возможность включать другие шаблоны в шаблон?

Если что-то из вышеперечисленного относится к вашему проекту, я бы рассмотрел использование механизма шаблонов, большинство из которых предоставляют эту функциональность, и многое другое.

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