Вставка именованных значений свойств, а-ля Ant - PullRequest
1 голос
/ 23 августа 2011

Мой вопрос похож на этот вопрос , который спрашивает, как подставить свойства в строку, такую ​​как

Перевод {0} из {1} в {2} на {3}

Ответ на этот вопрос, класс MessageFormat, не будет соответствовать моим потребностям. Я хотел бы заменить именованные параметры в строку вроде:

{погода} в {локации} находится в основном в {местности}.

или, возможно,

$ {weather} в $ {location} остается в основном в $ {terrain}.

Мне повезло, что уже существует класс, подобный MessageFormat, чтобы помочь с этим, или я должен собрать что-то самостоятельно, чтобы сделать это? Ant делает это с помощью build.xml - но если не считать снятия их кода, мне интересно, существует ли уже существующий класс.

Ответы [ 2 ]

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

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

Демонстрация с использованием StringTemplate:

import org.antlr.stringtemplate.StringTemplate;

public class STDemo {
  public static void main(String[] args) {
    StringTemplate st = new StringTemplate(
        "The $weather$ in $location$ stays mainly in the $terrain$."
    );
    st.setAttribute("weather", "rain");
    st.setAttribute("location", "London");
    st.setAttribute("terrain", "pubs");
    System.out.println(st.toString());
  }
}

напечатает:

The rain in London stays mainly in the pubs.
1 голос
/ 23 августа 2011

Могу ли я предложить создать новый класс с именем CustomMessageFormat:

public class CustomMessageFormat
{
    public static String format( String message, Object[] params )
    {
        Pattern pattern = Pattern.compile( "\\{(.*?)\\}" );
        Matcher matcher = pattern.matcher( message );
        StringBuffer sb = new StringBuffer();
        int i = 0;
        while ( matcher.find() )
        {
            matcher.appendReplacement( sb, "{" + ( i++ ) + "}" );
        }
        matcher.appendTail( sb );

        return MessageFormat.format( sb.toString(), params );
    }
}

Что все, что нужно, это заменить все ваши токены {sometext} на последовательные ({1}, {2} и т. Д.), Как того требует метод MessageFormat.format.

Вы можете просто использовать:

public static void main( String[] args )
{
    String inputMessage = "The {def1} in {def2} stays mainly in the {def3}.";
    String result = CustomMessageFormat.format( inputMessage, new Object[] { "sun", "Paris", "suburbs" } );
    System.out.println( result );
}

Это, конечно, грубый пример, но я надеюсь, что вы поняли идею.

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