You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:22:47