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

在Kotlin/java.util.Scanner中,能否不重复分隔符实现跳过操作?

解决Scanner重复使用分隔符的问题

问题场景

要解析的字符串格式如下:

"1: 2, 3, 4"
^^  ^^^^^^^
id  items

当前代码重复编写了分隔符: ,既用它分割id和items,又在后续调用skip(": "),想要避免这种重复。

方案1:移除多余的skip操作

实际上调用useDelimiter(": ").nextInt()读取id后,Scanner已经自动跳过了分隔符: ,指针直接指向items部分的起始位置,不需要额外执行skip(": ")。优化后的代码:

val sc = Scanner("1: 2, 3, 4")
val id = sc.useDelimiter(": ").nextInt()
val items = sc.useDelimiter(", ").asSequence().toList()

方案2:用正则一次性指定多分隔符

可以通过正则表达式同时指定两种分隔符,无需中途切换,直接完成id和items的读取:

val sc = Scanner("1: 2, 3, 4").useDelimiter(Regex(": |, "))
val id = sc.nextInt()
val items = generateSequence { sc.takeIf { it.hasNext() }?.next() }.toList()

这里正则": |, "表示分隔符可以是: 或者, ,读取完id后,后续元素会自动按, 分割。

方案3:先定位id再处理剩余内容

如果担心分隔符存在歧义,可以先匹配出id,再跳过后续的: 分隔符处理items:

val input = "1: 2, 3, 4"
val sc = Scanner(input)
val idStr = sc.findInLine(Regex("\\d+")) // 匹配数字格式的id
val id = idStr?.toInt() ?: 0
sc.skip(Regex(": ")) // 跳过id后的分隔符
val items = sc.useDelimiter(", ").asSequence().toList()

内容的提问来源于stack exchange,提问作者Felix Dombek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:06:02