Подтвердить что ты не робот

Java: замена регулярных выражений в больших файлах

Java java.util.regex.Matcher replaceFirst(...)/replaceAll(...) API возвращает строки, которые (при использовании размер кучи по умолчанию) вполне может привести к тому, что OOME будет вводить до 20-50M символов. Эти 2 метода могут быть легко переписаны на write до Writer вместо того, чтобы создавать укусы, эффективно устраняя одну точку отказа.

Matcher factory метод, однако принимает только CharSequence s, который также может выдать OOME, если я использую String s/StringBuffer s/StringBuilder с.

Как мне обернуть java.io.Reader для реализации интерфейса CharSequence (учитывая, что мои регулярные выражения могут содержать обратные ссылки)? Есть ли другое решение, которое может заменять регулярные выражения в файлах и не является OOME-подверженным на больших входах?

Другими словами, как мне реализовать функциональность, аналогичную функции GNU sed в Java (поскольку sed, как известно, решает файлы размером до нескольких терабайт, имея ту же поддержку расширенных регулярных выражений)

4b9b3361

Ответ 1

Так как вам действительно нужно поведение sed, вы можете выполнить его, выполнив что-то вроде этого:

String[] cmdArray = {"bash", "-c", "sed 's/YourRegex/YourReplaceStr/' inputfile > output"};
Process runCmd = Runtime.getRuntime().exec(cmdArray);

Я помещаю пример bash, но если вы хотите запустить его в Windows, вы можете установить команду sed через Cygwin и выполнить то же самое или просто установить команду sed для Windows, которую вы можете скачать здесь:

http://gnuwin32.sourceforge.net/packages/sed.htm

Для окон вы можете использовать:

String[] cmdArray = {"call", "sed 's/YourRegex/YourReplaceStr/' inputfile > output"};
Process runCmd = Runtime.getRuntime().exec(cmdArray);

У меня нет окон, поэтому вы не можете проверить выше команду, вам, возможно, придется удалить call или изменить call на sed. Еще одна альтернатива, которую вы можете попробовать:

String[] cmdArray = {"cmd", "/c", "sed 's/YourRegex/YourReplaceStr/' inputfile > output"};
Process runCmd = Runtime.getRuntime().exec(cmdArray);

В этой ссылке вы можете найти пример dir, выполненный из java, который вы можете адаптировать для использования sed.