6

次の形式の文字列があります

Select * where {{0} rdfs:label "Aruba" } limit 10

{0} を新しいテキストに置き換えたいのですが、最初の中かっこが原因でメッセージ形式が文字列を解析できないという問題があります。「{」を使用するとエスケープされることはわかっていますが、問題は、そのようなタイプの文字列がたくさんあり、中括弧の前後に手動で一重引用符を追加できないことです。これを行う関数を作成しても、プレースホルダー {0} の中括弧もエスケープされます。

ルビ文字列補間のような、メッセージ形式のより良い代替手段ですか。特定の部分を新しい文字列に置き換えることができる文字列テンプレートを作成する方法が欲しいだけです

4

3 に答える 3

3

printf新しい Java バージョンには、同様のメソッドを備えた java.util.Formatter があります。(String.format や PrintStream.printf のように、API 全体に分散しているいくつかのバリアントもあります)。

そこにあなたは書くでしょう

String some_text = "Hello";
String pattern = "Select * where {%s rdfs:label \"Aruba\" } limit 10";
String replaced = String.format(pattern, some_text);
于 2011-08-13T01:29:49.817 に答える
1

のすべての直接使用をMessageFormatあなたの方法に置き換えてください。メソッドで、中括弧を探し、コンテキストに基づいて中括弧を置き換えてから、に渡しますMessageFormat。愚かなこと

s.replace("{", "'{'").replace("}", "'}'").replaceAll("'\\{'(\\d+)'\\}'", "{$1}")

使用している引数の種類に応じて、実行できます。

String.replaceAll効率が気になる場合は、これを(特に)使用しないでください。私のソリューションは、の力を維持する必要がある場合に役立ちますMessageFormat。効率的なソリューションは、入力文字列を1回解析し、引用符で囲む必要がある中括弧を認識します。Pattern.replaceAllそれがどのように行われるかについては、のソースコードを見てください。

于 2011-08-13T01:56:32.073 に答える
0

MessageFormat を使用している文字列が正確にわからない場合、 MessageFormat を使用するのは危険です。{or記号が存在すると、}何をしていてもクラッシュします。これは、すぐに必要だったという理由だけで書いた小さなメソッドです。それがどれほど効率的か、私はチェックしていません。通常、DB への接続は、リクエストへの応答に費やされるすべての時間の 90% であるため、何かが機能的に効率的である場合、通常は実行する価値があります。jvm のみのアプリケーションでは、より注意する必要があります...

public formatMessage(String pattern, String... replacements ) {

    for(int i = 0; i < replacements.length; i++) {
        pattern = pattern.replace("{" + i + "}", replacements[i]);
    }

    return pattern;
}
于 2016-10-03T08:43:19.267 に答える