2

「supplant() は文字列の変数置換を行います。文字列をスキャンして { } 中かっこで囲まれた式を探します。式が見つかった場合は、それをオブジェクトのキーとして使用し、キーに文字列値または数値がある場合値、ブラケット式に置き換えられて繰り返されます。」

より具体的には、次のようなことをしようとしています:

public static String supplant(CharSequence message, Map<String,Object> params)

\{([\w]*)\} のような正規表現を使用して変数をキャプチャし、マップを検索して置換しようとしていますが、一致する正規表現を作成できませんでした...

Javaでsupplant()をどのように実装しますか?

4

2 に答える 2

2

この正確な形式で動作する必要がありますか? Java には、変数を文字列に代入するための組み込みメソッドがすでに用意されています。

見る:

于 2010-12-02T20:03:29.133 に答える
1

あなたが説明するものは、より一般的には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();
  }
}

明らかに、このコードはいくつかの重要なコンポーネント (主に例外処理) を省略していますが、この手法の主なポイントを示しています。

  1. group(1)括弧を使用して中括弧内のコンテンツをキャプチャし、Matcherを呼び出してアクセスします。
  2. appendReplacement(sb, "")以前の一致 (存在する場合) と現在の一致の間に表示されたテキストを追加するために使用します。
  3. 置換を検索し、StringBuffer のappend()メソッドを使用して追加します。(置換文字列を の 2 番目の引数として渡すことで、手順 2 と 3 を組み合わせることができappendReplacement()ますが、その場合、特別な扱いを受ける文字列内のドル記号とバックスラッシュに注意する必要があります。この方法ははるかに簡単です。)
  4. appendTail(sb)最後の一致の後に残っているものを追加するために使用します。

ボイラープレート コードをすべて書かなくても、この種のタスクを実行できるヘルパー クラスを何人かが公開しています。私のお気に入りは Elliott Hughes のRewriterです。

于 2010-12-02T21:42:29.010 に答える