Java apache commons StrSubstitutor サンプルプログラム
StrSubstitutorの説明(google翻訳)
文字列内の変数を値で置き換えます。
このクラスはテキストを取り込み、その中のすべての変数を代入します。変数のデフォルト定義は$ {variableName}です。プレフィックスと接尾辞はコンストラクタとメソッドを使って変更できます。変数値は、通常はマップから解決されますが、システムのプロパティやカスタム変数リゾルバを使用して解決することもできます。
最も簡単な例は、このクラスを使用してJavaシステムのプロパティを置き換えることです。例えば:
StrSubstitutor.replaceSystemProperties(
“あなたはjava.version = $ {java.version}とos.name = $ {os.name}で実行しています。”);このクラスの一般的な使用法は、次のパターンに従います。まず、使用可能な変数の値を含むマップを使用してインスタンスを作成し、初期化します。変数の接頭辞や接尾辞をデフォルト以外のものにする必要がある場合は、適切な設定を行うことができます。その後、補間のためにソーステキストを渡すことでreplace()メソッドを呼び出すことができます。返されたテキストでは、(変数の値がわかっている限り)すべての変数参照が解決されます。次の例はこれを示しています:
Map valuesMap = HashMap();
valuesMap.put( “animal”、 “quick brown fox”);
valuesMap.put( “target”、 “lazy dog”);
String templateString = “$ {animal}が$ {target}を飛び越えました。”;
StrSubstitutor sub =新しいStrSubstitutor(valuesMap);
文字列resolvedString = sub.replace(templateString);収穫:
クイックブラウンキツネは怠惰な犬の上に飛びついた。また、このクラスでは、未解決の変数のデフォルト値を設定できます。変数のデフォルト値は、変数のデフォルト値区切り文字の後に変数名に追加できます。変数デフォルト値区切り文字のデフォルト値は、bashや他の* nixシェルのように ‘: – ‘で、デフォルトの$ {}デリミタセットが起きた場所であると考えられます。可変のデフォルト値区切り文字は、setValueDelimiterMatcher(StrMatcher)、setValueDelimiter(char)またはsetValueDelimiter(String)を呼び出すことによって手動で設定できます。次の例は、可変のデフォルト値設定を示しています。
Map valuesMap = HashMap();
valuesMap.put( “animal”、 “quick brown fox”);
valuesMap.put( “target”、 “lazy dog”);
String templateString = “$ {animal}が$ {target}。$ {undefined.number:-1234567890}を飛び越えました。
StrSubstitutor sub =新しいStrSubstitutor(valuesMap);
文字列resolvedString = sub.replace(templateString);収穫:
クイックブラウンキツネは怠惰な犬の上に飛びついた。 1234567890この使用パターンに加えて、最も一般的な使用例をカバーするいくつかの静的な便利なメソッドがあります。これらのメソッドは、手動でインスタンスを作成する必要なく使用できます。ただし、複数の置換操作を実行する場合は、このクラスのインスタンスを作成して再利用する方が効率的です。
可変置換は再帰的に動作します。したがって、変数値に変数が含まれる場合、その変数も置換されます。巡回置換が検出され、例外がスローされます。
場合によっては、補間の結果に変数接頭辞が含まれている必要があります。例として、次のソーステキストを取る:
変数$ {$ {name}}を使用する必要があります。
ここでは、テキスト内で参照される変数の名前のみが置き換えられます(名前変数の値がxであると仮定して)。
変数$ {x}を使用する必要があります。この効果を実現するには、2つの可能性があります。生成する結果テキストと矛盾しない変数に別の接頭辞と接尾辞を設定する。もう1つの可能性は、エスケープ文字を使用することです(デフォルトは ‘$’)。この文字が可変参照の前に置かれている場合、この参照は無視され、置き換えられません。例えば:
変数$$ {$ {name}}を使用する必要があります。複雑なシナリオでは、変数名の代入を実行したい場合もあります
$ {jre – $ {java.specification.version}}
StrSubstitutorは変数名でこの再帰的置換をサポートしますが、enableSubstitutionInVariablesプロパティをtrueに設定することで明示的に有効にする必要があります。
EL式のような設定を置換できるものです。
EL式の場合は、${ と } を変換するのですが、この文字列も変換が可能です。
StrSubstitutor
package jp.pjin.tech.java; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import jp.pjin.tech.java.domain.Jaguar; import org.apache.commons.lang3.text.StrBuilder; import org.apache.commons.lang3.text.StrSubstitutor; public class CommonsExample28 { public static void main(String[] args) throws Exception { List<Jaguar> dataSrc = Arrays.asList(new Jaguar("1", "たま"), new Jaguar("2", "くろ"), new Jaguar("3", "しろ"), new Jaguar("4", "じゃぎゅあー")); String ol = "<ol>${lis}</ol>"; String li = "<li data-value='${id}'>${name}</li>\n"; StrBuilder lis = new StrBuilder(); dataSrc.forEach(jaguar -> { Map<String, String> repMap = new HashMap<>(); repMap.put("id", jaguar.getId()); repMap.put("name", jaguar.getName()); StrSubstitutor substitutor = new StrSubstitutor(repMap); lis.append(substitutor.replace(li)); }); Map<String, String> repMap = new HashMap<>(); repMap.put("lis", lis.toString()); StrSubstitutor substitutor = new StrSubstitutor(repMap); System.out.println(substitutor.replace(ol)); } }
Jaguar
package jp.pjin.tech.java.domain; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; public class Jaguar { private String id; private String name; public Jaguar(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public String getName() { return name; } @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } @Override public String toString() { return ReflectionToStringBuilder.toString(this); } }
今回は、オブジェクトをいれて、HTMLのリストなどを作成するサンプルを作成してみました。
もうちょっと簡単にできると思うのですが、今日のところはこの辺で。