лучший способ заменить все теги в строке на java
-
03-07-2019 - |
Вопрос
У меня есть сервисный метод, который принимает строку, а затем заменяет теги в строке элементами из библиотеки тегов.Следующим образом:
for( MetaDataDTO tag : tagValues )
{
message = message.replace( tag.getKey(), tag.getText1() );
}
Очевидно;это создает кучу новых строк и является ПЛОХИМ.Но метод замены StringBuilder громоздок в использовании для нескольких строк внутри одной строки.Как я могу сделать свой метод более эффективным?
Он предназначен для использования с блоками текста, такими как:
Уважаемый #FirstName #, ваша заявка на #ApplicationType # была #одобрена отклонена # извините.
Где #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();
}
Другие советы
По сути, вы хотите скопировать выполнение Совпадающий.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 в регулярном выражении).Вам нужно будет учесть это для того, что действительно допустимо (например, "# ([\w_]+)#").
Я также предположил, что приведенные выше теги выглядят примерно так:
Map<String, String> tags = new HashMap<String, String>();
tags.add("firstName", "Skippy");
и не:
tags.add("#firstName#", "Skippy");
Если второе верно, вам нужно будет соответствующим образом скорректировать его.
Этот метод выполняет ровно один проход по строке сообщения, так что он не становится намного эффективнее этого.