我有一个这样的字符串:
{0}/suhdp run -command "suhilb" -input /sufiles/{1} -output /seismicdata/mr_files/{2}/ -cwproot {3}
需要先替换第 0 和第 3 索引处的值。稍后,第一个和第二个索引将被替换(在已经部分格式化的字符串上)并最终使用。
我玩了一下ChoiceFormat但无法使用MessageFormat类来实现我想要的。
欢迎任何指点!
我有一个这样的字符串:
{0}/suhdp run -command "suhilb" -input /sufiles/{1} -output /seismicdata/mr_files/{2}/ -cwproot {3}
需要先替换第 0 和第 3 索引处的值。稍后,第一个和第二个索引将被替换(在已经部分格式化的字符串上)并最终使用。
我玩了一下ChoiceFormat但无法使用MessageFormat类来实现我想要的。
欢迎任何指点!
由于您不会一次填写所有值,因此建议您使用构建器:
public class MessageBuilder
{
private final String fmt;
private final Object[] args;
public MessageBuilder(final String fmt, final int nrArgs)
{
this.fmt = fmt;
args = new Object[nrArgs];
}
public MessageBuilder addArgument(final Object arg, final int index)
{
if (index < 0 || index >= args.length)
throw new IllegalArgumentException("illegal index " + index);
args[index] = arg;
return this;
}
public String build()
{
return MessageFormat.format(fmt, args);
}
}
这样你就可以做到:
final MessageBuilder msgBuilder = new MessageBuilder("{0}/suhdp run -command \"suhilb\" -input /sufiles/{1} -output /seismicdata/mr_files/{2}/ -cwproot {3}", 4)
.addArgument(arg0, 0).addArgument(arg3, 3);
// later on:
msgBuilder.addArgument(arg1, 1).addArgument(arg2, 2);
// print result
System.out.println(msgBuilder.build());
这段代码可能缺少一些错误检查等,而且远非最佳,但你明白了。
如果您确定特定字符串{somethinig}
没有在您的字符串中使用(似乎是这种情况),为什么不保持字符串原样并使用String.replace
它来将其更改为您以后拥有的任何值?
这有帮助吗?
最初会引用应在第二阶段替换的占位符。
public static void main(String[] args) {
final String partialResult = MessageFormat.format("{0} '{0}' '{1}' {1}", "zero", "three");
System.out.println(partialResult);
final String finalResult = MessageFormat.format(partialResult, "one", "two");
System.out.println(finalResult);
}
然后您的格式字符串变为:
{0}/suhdp run -command "suhilb" -input /sufiles/'{0}' -output /seismicdata/mr_files/'{1}'/ -cwproot {1}