Заменить все вхождения строки с помощью StringBuilder?

Я что-то упустил или в StringBuilder отсутствует та же функция «заменить все вхождения строки A строкой B», которую выполняет обычный класс String? Функция замены StringBuilder не совсем такая же. Есть ли способ сделать это более эффективно, не генерируя несколько строк, используя обычный класс String?

78
задан Cœur 15 April 2017 в 15:31
поделиться

3 ответа

Вы можете использовать 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());
34
ответ дан 24 November 2019 в 10:33
поделиться

Ну, вы можете написать цикл:

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 , работающий сзади. Я подозреваю, что это так, если вы заменяете длинную строку на короткую, поэтому, когда вы дойдете до начала, любые замены будут меньше копировать. В любом случае, это должно дать вам отправную точку.

74
ответ дан 24 November 2019 в 10:33
поделиться

java.util.regex.Pattern.matcher (CharSequence s) может использовать StringBuilder в качестве аргумента, чтобы вы могли найти и заменить каждое вхождение вашего шаблона с помощью start () и end () без вызова builder.toString ()

2
ответ дан 24 November 2019 в 10:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: