插入命名属性值,la Ant

时间:2011-08-22 20:13:16

标签: java parsing

我的问题类似于this question,它询问如何将属性替换为字符串,例如

  

在{3}

上将{0}从{1}转移到{2}

这个问题的答案,MessageFormat课程,不适合我的需要。我想将命名的参数替换为如下字符串:

  

{location}中的{weather}主要停留在{terrain}。

或者

  

$ {location}中的$ {weather}主要停留在$ {terrain}。

我很幸运,已经存在像MessageFormat这样的课程来帮助解决这个问题,还是应该自己拼凑一些东西来做呢? Ant使用build.xml执行此操作 - 但是没有解除代码,我想知道是否已经存在类。

2 个答案:

答案 0 :(得分:3)

您可以使用模板引擎进行此类操作。 Java有many个。两个受欢迎的是:

使用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 :(得分:1)

我建议创建一个名为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 );
    }
}

所有这一切都是按照MessageFormat.format方法的要求,将所有{sometext}标记替换为顺序标记({1},{2}等)。

你可以简单地使用:

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 );
}

这当然是一个粗略的例子,但我希望你明白这一点。