我的问题类似于this question,它询问如何将属性替换为字符串,例如
在{3}
上将{0}从{1}转移到{2}
这个问题的答案,MessageFormat
课程,不适合我的需要。我想将命名的参数替换为如下字符串:
{location}中的{weather}主要停留在{terrain}。
或者
$ {location}中的$ {weather}主要停留在$ {terrain}。
我很幸运,已经存在像MessageFormat
这样的课程来帮助解决这个问题,还是应该自己拼凑一些东西来做呢? Ant使用build.xml执行此操作 - 但是没有解除代码,我想知道是否已经存在类。
答案 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 );
}
这当然是一个粗略的例子,但我希望你明白这一点。