谢谢大家的回答!
Gizmo的答案绝对是开箱即用的,也是一个很好的解决方案,但不幸的是不适合,因为格式不能限制在这种情况下Formatter类所做的。
亚当Paynter真的把问题的核心,以正确的模式。
彼得尼克斯和肖恩布莱特有一个很好的解决方法,以避免所有的正则表达式的复杂性,但我需要提出一些错误,如果有不好的令牌,这是不行的。但是就做一个正则表达式和一个合理的替换循环而言,这是我想出的答案(来自谷歌和现有答案的一些帮助,包括肖恩布莱特关于如何使用组(1)的评论)对组()):
private static Pattern tokenPattern = Pattern.compile("\\{([^}]*)\\}");
public static String process(String template, Map<String, Object> params) {
StringBuffer sb = new StringBuffer();
Matcher myMatcher = tokenPattern.matcher(template);
while (myMatcher.find()) {
String field = myMatcher.group(1);
myMatcher.appendReplacement(sb, "");
sb.append(doParameter(field, params));
}
myMatcher.appendTail(sb);
return sb.toString();
}
凡doParameter得到值出来的图,并将其转换为字符串,并抛出一个异常,如果它不存在。
另请注意,我更改了模式以查找空括号(即{}),因为这是显式检查的错误条件。
编辑:
请注意,appendReplacement是不可知的字符串的内容。根据javadocs,它将$和反斜杠识别为特殊字符,所以我添加了一些转义来处理上面的示例。没有以最具表现意识的方式完成,但在我的情况下,尝试对字符串创作进行微观优化是不值得的。
感谢来自Alan M的评论,这可以更简单地避免appendReplacement的特殊字符问题。
尝试http://github.com/niesfisch/tokenreplacer/ – Marcel 2011-04-20 20:07:56