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

Java如何通过Scanner分隔符读取含换行的分号分隔文本字段

原代码问题根源

  1. Scanner默认使用所有空白字符(空格、换行符、制表符等)作为分隔符,调用sc.next()时会自动跳过所有前置空白,直接丢弃字段内的换行符
  2. 手动拼接时加空格的逻辑,会把原本字段内的换行、连续空格等原始格式替换为单个空格,破坏字段原有内容

解决方案

方案1:修改Scanner全局分隔符(最简方案)

直接将Scanner的分隔符设置为分号,原生的next()方法就会自动返回下一个分号前的完整内容,自动保留换行、空格等原始格式:

// 初始化Scanner后全局设置一次即可
sc.useDelimiter(";");

private static String grabField(Scanner sc) {
    return sc.hasNext() ? sc.next() : null;
}

方案2:不修改全局分隔符的实现

如果不想改动Scanner的全局分隔符配置,可以用findWithinHorizon方法直接匹配目标字段,不受默认分隔符影响:

private static String grabField(Scanner sc) {
    // 正则匹配所有非分号字符,支持跨行,末尾可选匹配分号
    String match = sc.findWithinHorizon("([^;]*);?", 0);
    if (match == null) {
        return null;
    }
    // 移除末尾的分隔符分号
    return match.endsWith(";") ? match.substring(0, match.length() - 1) : match;
}

特殊场景适配

如果导出的字段内存在被引号包裹的内容,且引号内部包含分号,只需要调整正则适配引号转义即可:

// 正则支持匹配引号包裹的含分号内容
String match = sc.findWithinHorizon("(?s)(\"[^\"]*\"|[^;]*);?", 0);

内容的提问来源于stack exchange,提问作者David Tejuosho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:45:04