在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
相关产品推荐
相关产品推荐

