Vielen Dank für die Antworten!
Gizmos Antwort war definitiv out of the box, und eine großartige Lösung, aber leider nicht geeignet, da das Format nicht auf das beschränkt werden kann, was die Formatter-Klasse in diesem Fall tut.
Adam Paynter kam mit dem richtigen Muster wirklich zum Kern der Sache.
Peter Nix und Sean Bright hatten einen großen Workaround, um alle Komplexitäten der Regex zu vermeiden, aber ich musste einige Fehler melden, wenn es schlechte Token gab, was das nicht tat.
Aber in Bezug auf sowohl eine Regex und eine vernünftige Replace-Schleife, das ist die Antwort, die ich kam (mit ein wenig Hilfe von Google und die vorhandene Antwort, einschließlich Sean Bright's Kommentar zur Verwendung der Gruppe (1) vs Gruppe()):
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();
}
Wo doParameter den Wert aus der Karte bekommt und wandelt sie in einen String und wirft eine Ausnahme, wenn sie nicht da ist.
Beachten Sie auch, dass ich das Muster geändert habe, um leere Klammern (d. H. {}) Zu finden, da dies eine Fehlerbedingung ist, auf die ausdrücklich geprüft wird.
EDIT:
Beachten Sie, dass appendReplacement nicht agnostisch über den Inhalt der Zeichenfolge ist. Für die Javadocs erkennt es $ und Backslash als Sonderzeichen, also habe ich etwas Escaping hinzugefügt, um das mit dem obigen Beispiel zu behandeln. Nicht auf die leistungsfähigste Weise gemacht, aber in meinem Fall ist es nicht groß genug, um zu versuchen, die String-Kreationen zu optimieren.
Dank des Kommentars von Alan M kann dies noch einfacher gemacht werden, um die speziellen Charakterprobleme von appendReplacement zu vermeiden.
versuchen Sie http://github.com/niesfisch/tokenreplacer/ – Marcel