Я что-то упустил или в StringBuilder отсутствует та же функция «заменить все вхождения строки A строкой B», которую выполняет обычный класс String? Функция замены StringBuilder не совсем такая же. Есть ли способ сделать это более эффективно, не генерируя несколько строк, используя обычный класс String?
Вы можете использовать Pattern / Matcher . Из документации Matcher javadocs:
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "dog");
}
m.appendTail(sb);
System.out.println(sb.toString());
Ну, вы можете написать цикл:
public static void replaceAll(StringBuilder builder, String from, String to)
{
int index = builder.indexOf(from);
while (index != -1)
{
builder.replace(index, index + from.length(), to);
index += to.length(); // Move to the end of the replacement
index = builder.indexOf(from, index);
}
}
Обратите внимание, что в некоторых случаях может быть быстрее использовать lastIndexOf
, работающий сзади. Я подозреваю, что это так, если вы заменяете длинную строку на короткую, поэтому, когда вы дойдете до начала, любые замены будут меньше копировать. В любом случае, это должно дать вам отправную точку.
java.util.regex.Pattern.matcher (CharSequence s) может использовать StringBuilder в качестве аргумента, чтобы вы могли найти и заменить каждое вхождение вашего шаблона с помощью start () и end () без вызова builder.toString ()