Если вы хотите выполнить пошаговую замену, вы можете использовать явный цикл appendReplacement/Tail
для StringBuffer
(к сожалению, пока нет перегрузок StringBuilder
).
Вот идиома издокументация :
Pattern p = Pattern.compile(PATTERN);
Matcher m = p.matcher(INPUT_SOURCE);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, REPLACEMENT);
}
m.appendTail(sb);
System.out.println(sb.toString());
Это почти то, как реализован replaceAll
.
Преимущество этого метода в том, что, поскольку у вас есть полный контроль над итерацией замены, выне нужно хранить весь вывод в памяти в любой момент времени как потенциально длинный String
.Вы можете постепенно создавать выходные данные, периодически сбрасывая содержимое StringBuffer
на диск.Таким образом, использование этого метода может быть более эффективным для памяти , чем при использовании replaceAll
.
(Вы также можете выполнять необычные замены, которые не поддерживаются текущим синтаксисом замены, например, toUpperCase()
преобразование).
Обратите внимание, что существует запрос на улучшение для Matcher
, чтобы иметь возможность добавить к любому Appendable
.Если предоставлено, вы можете не только использовать StringBuilder
, но вы также можете напрямую заменить, например, FileWriter
.
Связанные вопросы
См. Также