Нужен эффективный алгоритм для реализации String.replaceAll () - PullRequest
0 голосов
/ 19 августа 2010

Я обнаружил String.replaceAll () в Java с регулярным выражением .Он отлично работает в короткой строке.Но в случае длинной строки мне нужен более эффективный алгоритм вместо String.replaceAll ().Кто-нибудь может дать совет?Спасибо!

Ответы [ 2 ]

4 голосов
/ 19 августа 2010

Если вы хотите выполнить пошаговую замену, вы можете использовать явный цикл 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.

Связанные вопросы

См. Также

0 голосов
/ 19 августа 2010

Вы можете попробовать String.replace(CharSequence target, CharSequence replacement). Он по-прежнему использует шаблон и сопоставление, но target не является регулярным выражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...