Java java.util.regex.Matcher
replaceFirst(...)
/ replaceAll(...)
API返回字符串,如果使用默认堆大小,可能会导致OOME输入大小为20-50M字符。这两种方法可以很容易地重写为write到Writer
,而不是构造蜇,有效地消除了一个失败点。
Matcher
的{{3}}只接受CharSequence
,如果我使用String
s / {{1},也可能会抛出OOME } S / StringBuffer
秒。
如何包装StringBuilder
以实现java.io.Reader
接口(假设我的正则表达式可能包含反向引用)?
是否有任何其他解决方案可以替换文件中的正则表达式而不是大型输入上的OOME?
换句话说,我如何在Java中实现类似于GNU CharSequence
的功能(因为sed
已知可以处理大到几TB的文件,同时具有相同的支持扩展正则表达式)?
答案 0 :(得分:1)
因为您需要的是sed
行为,您可以通过执行以下操作来执行它:
String[] cmdArray = {"bash", "-c", "sed 's/YourRegex/YourReplaceStr/' inputfile > output"};
Process runCmd = Runtime.getRuntime().exec(cmdArray);
我放了一个bash示例但是如果你想在windows上运行它你可以通过Cygwin安装sed
命令并执行相同的命令或者只安装windows的sed命令,你可以从这里下载:
http://gnuwin32.sourceforge.net/packages/sed.htm
对于Windows,您可以使用:
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);
在这个link中,您可以找到从java执行的dir
示例,您可以将其调整为使用sed。