gpt4 book ai didi

java - 用于搜索和替换大文件中文本的正则表达式

转载 作者:搜寻专家 更新时间:2023-11-01 03:50:46 25 4
gpt4 key购买 nike

我正在一个巨大的文件中搜索多行模式,如果找到需要替换内容。我想以一种内存有效的方式来完成这个。我当前的实现以 4096 字节为单位从文件中读取文本。然后它应用正则表达式搜索替换并将结果保存在缓冲区输出流中。通过不将整个文件加载到内存中,这确实给了我一些内存改进,但是我正在使用 map/flush 调用进行大量 IO。需要进一步改进我的代码的建议。此外,如果要搜索的模式被分成相邻的 block ,算法也会失败。关于如何有效地搜索替换被分成相邻 block 的文本的任何想法。假设:要搜索的文本总是小于 4096 字节。

public void searchAndReplace (String inputFilePath, String outputFilePath) {

Pattern HEADER_PATTERN = Pattern.compile("<a [^>]*>[^(</a>)]*</a>", Pattern.DOTALL);
Charset UTF8 = Charset.forName("UTF-8");
File outputFile = new File(outputfilepath);
if (!outputFile.exists()) {
outputFile.createNewFile();
}

FileInputStream inputStream = new FileInputStream(new File(inputfilepath));
FileOutputStream outputStream = new FileOutputStream(outputFile);

FileChannel inputChannel = inputStream.getChannel();

final long length = inputChannel.size();
long pos = 0;
while (pos < length) {
int remaining = (int)(length - pos) > 4096 ? 4096 : (int)(length - pos);
MappedByteBuffer map = inputChannel.map(FileChannel.MapMode.READ_ONLY, pos, remaining);
CharBuffer cbuf = UTF8.newDecoder().decode(map);
Matcher matcher = HEADER_PATTERN.matcher(cbuf);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "Some text");
}
matcher.appendTail(sb);
outputStream.write(sb.toString().getBytes());
outputStream.flush();
pos = pos + 4096;
}

inputStream.close();
outputStream.close();
}

最佳答案

声明一个不太可能出现在您的字符串中的特殊字符列表。然后测试您的字符串以确保其中一个特殊字符不会退出其中。在要执行正则表达式的区域之间放置特殊字符。然后您可以使用/[^¬]*myRegExHere[^\¬]/g 进行查找/替换或搜索

关于java - 用于搜索和替换大文件中文本的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29291382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com