Java如何通过Scanner分隔符读取含换行的分号分隔文本字段
原代码问题根源
Scanner默认使用所有空白字符(空格、换行符、制表符等)作为分隔符,调用sc.next()时会自动跳过所有前置空白,直接丢弃字段内的换行符- 手动拼接时加空格的逻辑,会把原本字段内的换行、连续空格等原始格式替换为单个空格,破坏字段原有内容
解决方案
方案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
相关产品推荐
相关产品推荐

