Java中Scanner的useDelimiter()方法用于设置正则分隔符以解析结构化文本,支持自定义如“|”“,”等分隔符,需注意元字符转义、nextLine()受其影响及推荐配合hasNext()/next()使用。

Java 中 Scanner 的 useDelimiter() 方法用于自定义分隔符,从而按你指定的规则切分输入内容,特别适合解析结构化文本(如 CSV、日志、配置文件等)。
useDelimiter() 的基本用法
默认情况下,Scanner 使用空白字符(空格、制表符、换行等)作为分隔符。调用 useDelimiter(Pattern pattern) 或 useDelimiter(String pattern) 可替换为正则表达式定义的分隔逻辑。
-
useDelimiter("\s+"):等价于默认行为(一个或多个空白) -
useDelimiter(","):按英文逗号切分(注意:普通字符串会被转义为正则,逗号无需转义) -
useDelimiter("[,;\s]+"):匹配逗号、分号或空白中任意一种或多种组合 -
useDelimiter("\|"):按竖线|切分(需转义,因为|是正则元字符)
解析带分隔符的文件示例
假设有一个 CSV 文件 data.txt,内容如下:
Bob|30|Designer|Shanghai
你想按 | 拆出姓名、年龄、职位、城市:
立即学习“Java免费学习笔记(深入)”;
Scanner sc = new Scanner(new File("data.txt"));
sc.useDelimiter("\|"); // 设置竖线为分隔符
while (sc.hasNextLine()) {
Scanner lineScanner = new Scanner(sc.nextLine());
lineScanner.useDelimiter("\|");
if (lineScanner.hasNext()) {
String name = lineScanner.next().trim();
String age = lineScanner.next().trim();
String role = lineScanner.next().trim();
String city = lineScanner.next().trim();
System.out.println(name + ", " + age + ", " + role + ", " + city);
}
lineScanner.close();
}
sc.close();
注意:对每行再创建一个 Scanner 并设置分隔符,可避免跨行干扰;外层用 hasNextLine() 控制行读取,内层用 next() 按 | 提取字段。
常见陷阱与注意事项
- 正则特殊字符必须转义:
.、|、+、*、?等在正则中有含义,直接写字符串会出错,要用"\."、"\|"等 - 分隔符匹配后会被跳过,不会出现在
next()结果中 -
useDelimiter()影响后续所有nextXXX()调用,包括nextLine()—— 它也受分隔符影响!如果设了非换行符分隔符,nextLine()可能只读到“半行”,建议按行读取时单独处理每行 - 若输入末尾无分隔符,最后一个字段仍可被
next()正常读取(只要还有 token)
配合 hasNext() 和 next() 的典型流程
使用自定义分隔符时,推荐模式是:
- 先用
hasNext()判断是否还有下一个 token(不是hasNextLine()) - 再用
next()获取该 token - 如需类型转换,用
nextInt()、nextDouble()等 —— 它们基于当前分隔符切分后的子串解析,失败会抛InputMismatchException - 遇到格式不一致数据,建议捕获异常或先用
next()得到字符串再手动解析


















