В основном вы хотите скопировать выполнение 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 в регулярном выражении). Вам нужно будет обработать это для того, что действительно допустимо (например, "# ([\ w _] +) #").
Я также предположил, что приведенные выше теги выглядят примерно так:
Map<String, String> tags = new HashMap<String, String>();
tags.add("firstName", "Skippy");
а не:
tags.add("#firstName#", "Skippy");
Если второе правильно, вам нужно будет соответственно отрегулировать.
Этот метод делает ровно один проход по строке сообщения, поэтому он не становится намного более эффективным, чем этот.