лучшая альтернатива формату сообщения - PullRequest
5 голосов
/ 13 августа 2011

У меня есть строка следующего формата

Select * where {{0} rdfs:label "Aruba" } limit 10

Теперь я хотел бы заменить {0} новым текстом, но проблема в том, что формат сообщения не может проанализировать строку из-за первого вьющегосяскобка.Я знаю, что если бы я использовал '{', это избежало бы его, но проблема в том, что у меня есть множество строк такого типа, и я не могу вручную добавить одинарные кавычки до и после фигурной скобки.Даже если я напишу функцию для этого, она также избежит фигурных скобок для заполнителя {0}.

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

Ответы [ 3 ]

3 голосов
/ 13 августа 2011

Более новые версии Java имеют java.util.Formatter с его printf подобными методами.(Есть также несколько их вариантов, разбросанных по всему API, например String.format и PrintStream.printf).

Там вы бы написали

String some_text = "Hello";
String pattern = "Select * where {%s rdfs:label \"Aruba\" } limit 10";
String replaced = String.format(pattern, some_text);
1 голос
/ 13 августа 2011

Замените все прямые использования MessageFormat вашим методом.В вашем методе найдите фигурные скобки и замените их в зависимости от контекста, прежде чем передавать его в MessageFormat.Что-то настолько глупое, как может

s.replace("{", "'{'").replace("}", "'}'").replaceAll("'\\{'(\\d+)'\\}'", "{$1}")

, в зависимости от того, какие аргументы вы используете.

Не используйте это (особенно String.replaceAll), если вас это беспокоитс эффективностью.Мое решение полезно, если вам нужно сохранить мощность MessageFormat.Эффективное решение будет один раз проанализировать входную строку и распознать, какие фигурные скобки следует заключить в кавычки.Посмотрите на исходный код Pattern.replaceAll, как это можно сделать.

0 голосов
/ 03 октября 2016

MessageFormat просто опасно использовать, если вы точно не знаете, какой строкой вы его кормите. Любое присутствие знака { или } может привести к сбою независимо от того, что вы делаете. Вот небольшой метод, который я написал только потому, что он мне понадобился немедленно Насколько это эффективно, я не проверял. Обычно подключение к БД составляет 90% времени, затрачиваемого на ответ на запрос, поэтому, если что-то работает функционально, это обычно стоит делать. В jvm-приложении вы должны быть осторожнее ...

public formatMessage(String pattern, String... replacements ) {

    for(int i = 0; i < replacements.length; i++) {
        pattern = pattern.replace("{" + i + "}", replacements[i]);
    }

    return pattern;
}
...