Java:在大文件中替换正则表达式

2022-09-04 23:32:16

Java replaceFirst(...)/replaceAll(...)API 返回字符串,这(如果使用默认堆大小)很可能会导致 OOME 输入大至 20-50M 个字符。这2种方法可以很容易地重写为写入s而不是构造刺痛,有效地消除了一个故障点。java.util.regex.MatcherWriter

然而,的工厂方法只接受 s,如果我使用 s/s/s,它也可能会抛出一个 OOME。MatcherCharSequenceStringStringBufferStringBuilder

如何包装一个来实现接口(考虑到我的正则表达式可能包含反向引用)?有没有其他解决方案可以替换文件中的正则表达式,并且在大输入上不容易出现OOME?java.io.ReaderCharSequence

换句话说,我如何实现类似于Java中GNU的功能(众所周知,它可以处理多达几TB的文件,同时对扩展正则表达式具有相同的支持)?sedsed


答案 1

由于您需要的实际上是行为,因此您可以通过执行如下操作来执行它:sed

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

我放了一个bash示例,但如果你想在Windows上运行它,你可以通过Cygwin安装命令并执行相同的命令,或者只是为Windows安装sed命令,你可以从这里下载:sed

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

对于窗口,您可以使用:

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

我没有窗口,所以无法测试上面的命令,你也许必须删除或更改为只是.您可以尝试的另一种方法是:callcallsed

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

在此链接中,您可以找到一个从java执行的示例,您可以对其进行调整以使用sed。dir


答案 2