【发布时间】:2012-06-29 15:03:09
【问题描述】:
是否有类似String.format 的标准或至少广泛的实现,但带有命名参数?
我想用这样的方式格式化一个模板化的字符串:
Map<String, Object> args = new HashMap<String, Object>();
args.put("PATH", "/usr/bin");
args.put("file", "foo");
String s = someHypotheticalMethod("#{PATH}/ls #{file}");
// "/usr/bin/ls foo"
从技术上讲,它几乎与以下内容相同:
String[] args = new String[] { "/usr/bin", "foo" };
String s = String.format("%1$s/ls %2$s", args);
// "/usr/bin/ls foo"
但带有命名参数。
我知道:
但它们都使用有序或至少编号的参数,而不是命名参数。我知道实现它很简单,但是我是否在标准 Java 库或至少在 Apache Commons / Guava / 类似的东西中寻找一种机制,而不引入高调的模板引擎?
注意:我对成熟的模板引擎并不感兴趣,它具有一些命令式/函数式逻辑、流控制、修饰符、子模板/包含、迭代器等功能。一般来说以下方法是一个有效的 4 行实现 - 这就是我所需要的:
public static String interpolate(String format, Map<String, ? extends Object> args) {
String out = format;
for (String arg : args.keySet()) {
out = Pattern.compile(Pattern.quote("#{" + arg + "}")).
matcher(out).
replaceAll(args.get(arg).toString());
}
return out;
}
【问题讨论】:
-
您不只是使用“#” + args.get("PATH") + "/ls #" + args.get("file") 的任何原因?
-
我有一堆模板文件,我有一个参数映射,我需要从每个模板文件中获取填充字符串。
标签: java string-formatting template-engine