あなたが説明するものは、より一般的にはtemplatingと呼ばれます。多くのテンプレート アプリケーションとライブラリが存在しますが、簡単なソリューションが必要な場合は、正規表現を使用して簡単に実装できます。
多くの正規表現フレーバーでは、PHP の関数や Perl の修飾子など、組み込みのコールバックまたはコールアウトメカニズムを使用します。Java にはそのようなものはありませんが、自分で実装できるようにするための API が提供されています。次に例を示します。preg_replace_callback
/e
/ee
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();
}
}
明らかに、このコードはいくつかの重要なコンポーネント (主に例外処理) を省略していますが、この手法の主なポイントを示しています。
group(1)
括弧を使用して中括弧内のコンテンツをキャプチャし、Matcherを呼び出してアクセスします。
appendReplacement(sb, "")
以前の一致 (存在する場合) と現在の一致の間に表示されたテキストを追加するために使用します。
- 置換を検索し、StringBuffer の
append()
メソッドを使用して追加します。(置換文字列を の 2 番目の引数として渡すことで、手順 2 と 3 を組み合わせることができappendReplacement()
ますが、その場合、特別な扱いを受ける文字列内のドル記号とバックスラッシュに注意する必要があります。この方法ははるかに簡単です。)
appendTail(sb)
最後の一致の後に残っているものを追加するために使用します。
ボイラープレート コードをすべて書かなくても、この種のタスクを実行できるヘルパー クラスを何人かが公開しています。私のお気に入りは Elliott Hughes のRewriterです。