Was Sie beschreiben, wird üblicherweise als Vorlagenerstellung . Es gibt viele Templating-Anwendungen und -Bibliotheken, aber wenn Sie nur eine schnelle und unkomplizierte Lösung wollen, kann sie leicht mit Regexen implementiert werden.
In vielen Regex-Varianten würden Sie eine eingebaute Rückruf o Aufforderung Mechanismus, wie der von PHP preg_replace_callback
Funktion oder Perl's /e
y /ee
Modifikatoren. Java hat so etwas nicht, aber es bietet eine API, mit der Sie es selbst implementieren können. Hier ist ein Beispiel:
import java.util.*;
import java.util.regex.*;
public class Test
{
public static void main(String[] args) throws Exception
{
String s = "Lorem ipsum {foo} impedit civibus ei pri, legimus\n" +
"antiopam no {marco}, quo id everti forensibus maiestatis.";
Map<String,Object> p = new HashMap<String,Object>()
{{
put("foo", "BAR");
put("marco", "POLO!");
}};
System.out.printf("%s%n%n%s%n", s, supplant(s, p));
}
public static CharSequence supplant(CharSequence message, Map<String,Object> params)
{
Matcher m = Pattern.compile("\\{(\\w+)\\}").matcher(message);
StringBuffer sb = new StringBuffer();
while (m.find())
{
m.appendReplacement(sb, "");
String key = m.group(1);
sb.append(params.get(key).toString());
}
m.appendTail(sb);
return sb.toString();
}
}
Natürlich lässt dieser Code einige wesentliche Komponenten aus (vor allem die Behandlung von Ausnahmen), aber er demonstriert die wichtigsten Punkte dieser Technik:
- Erfassen Sie den Inhalt innerhalb der geschweiften Klammern mit Hilfe von Klammern, und greifen Sie dann auf ihn zu, indem Sie
group(1)
auf den Matcher.
- Verwenden Sie
appendReplacement(sb, "")
um den Text anzuhängen, der zwischen der vorherigen Übereinstimmung (falls es eine gab) und der aktuellen Übereinstimmung erschien.
- Suchen Sie die Ersetzung und fügen Sie sie mit StringBuffer's
append()
Methode. (Sie könnte kombinieren Sie die Schritte 2 und 3, indem Sie die Ersetzungszeichenfolge als zweites Argument an appendReplacement()
aber dann müssten Sie auf Dollarzeichen und Backslashes in der Zeichenkette achten, die eine Sonderbehandlung erfahren. Dieser Weg ist viel einfacher.)
- Verwenden Sie
appendTail(sb)
um das anzuhängen, was nach der letzten Übereinstimmung übrig ist.
Mehrere Leute haben Hilfsklassen veröffentlicht, mit denen Sie diese Art von Aufgabe erledigen können, ohne den ganzen Boilerplate-Code schreiben zu müssen. Mein Favorit ist Elliott Hughes' Rewriter .