如何同时使用逗号和换行符作为StringTokenizer的分隔符

stringtokenizer支持多字符分隔符,只需将逗号(`,`)和换行符(`\n`)合并为一个字符串(如`",\n"`)传入构造函数,即可同时按两者切分字符串,无需正则或额外预处理。

StringTokenizer 的第二个构造参数接受一个分隔符集合(delimiter set),它会将该字符串中的每个字符都视为独立的分隔符,而非将其当作整体子串匹配。因此,传入 ",\n" 并非表示“先逗号后换行”的组合,而是告诉 StringTokenizer:遇到 , 或 \n 中的任意一个字符,就进行一次分割

这意味着以下所有情况均会被正确识别为分隔位置:

  • 单独的 ,(如 "apple,tree" → "apple", "tree")
  • 单独的 \n(如 "wolf\neagle" → "wolf", "eagle")
  • 相邻出现的 , 和 \n(如 "tree,\nwolf" → "tree", "wolf")
  • 甚至 \n,\n 或 ,,\n 等连续分隔符也会被统一视为空白分隔,自动跳过空 token(除非显式启用 returnDelims = true)。

✅ 正确用法示例:

String data = "hello apple, tree, wolf\neagle\nbadge";
StringTokenizer tokens = new StringTokenizer(data, ",\n"); // ✅ 同时指定逗号与换行符

while (tokens.hasMoreTokens()) {
    String token = tokens.nextToken().trim(); // 建议 trim() 去除首尾空格
    System.out.println("[" + token + "]");
}

输出结果(已 trim):

[hello apple]
[tree]
[wolf]
[eagle]
[badge]

⚠️ 注意事项:

  • StringTokenizer 不支持正则表达式,因此 ",\\n" 或 ",\r?\n" 等写法无效;若需更复杂的分隔逻辑(如仅匹配 ,\n 组合、忽略单独换行),应改用 String.split() 配合正则(例如:line.split(",\\s*|\\s*\\n\\s*"))。
  • Windows 系统文本中换行符常为 \r\n,若需兼容,建议先对原始字符串执行 str.replace("\r\n", "\n").replace("\r", "\n"),再传入 StringTokenizer。
  • StringTokenizer 是遗留类(legacy),官方文档推荐优先使用 String.split() 或 java.util.Scanner;但若项目受限于旧环境或追求轻量无正则依赖,StringTokenizer 仍可靠高效。

总结:要同时以逗号和换行符分隔,只需 new StringTokenizer(line, ",\n") —— 简洁、有效、无

需额外依赖。