Scanner循环匹配指定内容后读取后续5行及冲突场景处理咨询
解决方案:匹配指定内容后读取后续行并处理嵌套匹配
没问题,这需求在文本处理里挺常见的,我来给你拆解两种场景的可行方案~
一、基础场景:匹配后读取固定5行
如果不需要考虑后续5行里再次出现匹配内容的情况,直接用循环读取就行。这里推荐用StringBuilder来拼接内容,比反复拼接String效率高很多:
// 用try-with-resources自动关闭流,避免资源泄漏 try (FileInputStream inputStream = new FileInputStream(file); Scanner sc = new Scanner(inputStream, "UTF-8")) { StringBuilder matchedLines = new StringBuilder(); // 如果需要存储多次匹配的结果,可以用List<String>来存每个匹配块 // List<String> resultList = new ArrayList<>(); while (sc.hasNextLine()) { String line = sc.nextLine(); if (line.contains("blablbal")) { // 读取接下来的5行,同时判断文件是否还有内容 for (int i = 0; i < 5 && sc.hasNextLine(); i++) { String nextLine = sc.nextLine(); matchedLines.append(nextLine).append(System.lineSeparator()); // 保留换行符 } // 每次匹配完成后,把内容转成String存入集合(可选) // resultList.add(matchedLines.toString()); // matchedLines.setLength(0); // 清空准备下一次匹配 } } } catch (IOException e) { e.printStackTrace(); }
二、进阶场景:处理嵌套匹配(后续行中再次出现目标内容)
如果碰到后续5行里又出现blablbal,需要重新开始计数读取5行(比如刚读了2行就触发匹配,那就从这行之后再读5行),这时候得用计数器来动态跟踪需要读取的行数:
try (FileInputStream inputStream = new FileInputStream(file); Scanner sc = new Scanner(inputStream, "UTF-8")) { StringBuilder currentBlock = new StringBuilder(); int remainingLines = 0; // 标记还需要读取多少行 List<String> resultList = new ArrayList<>(); // 存储所有匹配块 while (sc.hasNextLine()) { String line = sc.nextLine(); // 检查当前行是否触发匹配 if (line.contains("blablbal")) { // 如果之前还有未读完的块,先保存并清空 if (remainingLines > 0) { resultList.add(currentBlock.toString()); currentBlock.setLength(0); } remainingLines = 5; // 重置计数器为5 // 如果你需要把触发匹配的行本身也包含进去,就加这行 // currentBlock.append(line).append(System.lineSeparator()); } // 如果还有需要读取的行,就加入当前块 if (remainingLines > 0) { currentBlock.append(line).append(System.lineSeparator()); remainingLines--; // 当读完指定行数后,保存结果并清空块 if (remainingLines == 0) { resultList.add(currentBlock.toString()); currentBlock.setLength(0); } } } // 处理文件末尾可能未完成的块(比如最后一次匹配后没读完5行) if (remainingLines > 0 && currentBlock.length() > 0) { resultList.add(currentBlock.toString()); } } catch (IOException e) { e.printStackTrace(); }
关键逻辑说明
- 用
remainingLines变量动态跟踪还需要读取的行数,初始为0(不读取状态) - 每次触发匹配时,重置计数器为5,同时处理之前未完成的块(根据你的业务需求选择保存或覆盖)
- 每读取一行就递减计数器,直到计数器归0,完成当前匹配块的存储
内容的提问来源于stack exchange,提问作者patoCapongo93
相关产品推荐
相关产品推荐

