文字列内のすべてのタグをjavaで置き換える最良の方法
-
03-07-2019 - |
質問
文字列を取得し、文字列内のタグをタグライブラリのアイテムで置き換えるサービスメソッドがあります。次のとおりです。
for( MetaDataDTO tag : tagValues )
{
message = message.replace( tag.getKey(), tag.getText1() );
}
明らかに。これは、新しい文字列のヒープを作成し、悪いです。ただし、StringBuilderのreplaceメソッドは、1つの文字列内の複数の文字列に対して使用するのが面倒です。メソッドをより効率的にするにはどうすればよいですか?
次のようなテキストブロックで使用します。
#firstName#様、#applicationType#のアプリケーションは#approvedRejected#申し訳ありません。
#firstName#などは、メタデータデータベースのキーです。タグがハッシュ文字で囲まれていない可能性もあります。
解決 2
助けてくれてありがとう。確かにJavaの詳細を学びました。これが私の解決策です。異なる外観のタグとタグ内のタグをサポートするのはこの方法です:
private static String replaceAllTags(String message, Map< String, String > tags)
{
StringBuilder sb = new StringBuilder( message );
boolean tagFound = false;
/**
* prevent endless circular text replacement loops
*/
long recurrancyChecker = 5000;
do
{
tagFound = false;
Iterator it = tags.entrySet().iterator();
while( it.hasNext() )
{
Map.Entry pairs = (Map.Entry) it.next();
int start = sb.indexOf( pairs.getKey().toString() );
while( start > -1 && --recurrancyChecker > 0 )
{
int length = pairs.getKey().toString().length();
sb.replace( start, start + length, pairs.getValue().toString() );
start = sb.indexOf( pairs.getKey().toString() );
tagFound = true;
}
}
}
while( tagFound && --recurrancyChecker > 0 );
return sb.toString();
}
他のヒント
基本的に、 Matcher.replaceAll()のように:
public static String replaceTags(String message, Map<String, String> tags) {
Pattern p = Pattern.compile("#(\\w+)#");
Matcher m = p.matcher(message);
boolean result = m.find();
if (result) {
StringBuffer sb = new StringBuffer();
do {
m.appendReplacement(sb, tags.containsKey(m.group(1) ? tags.get(m.group(1)) : "");
result = m.find();
} while (result);
m.appendTail(sb);
message = sb.toString();
}
return message;
}
注:有効なタグ(正規表現では\ w)について仮定しました。本当に有効なものに対応する必要があります(例:&quot;#([\ w _] +)#&quot;)。
上記のタグは次のようなものであると仮定しました:
Map<String, String> tags = new HashMap<String, String>();
tags.add("firstName", "Skippy");
ではなく:
tags.add("#firstName#", "Skippy");
2番目が正しい場合、それに応じて調整する必要があります。
このメソッドは、メッセージ文字列を正確に1回通過させるため、これよりもはるかに効率的になることはありません。
所属していません StackOverflow