Kotlin中split()如何保留重复字符串?拆分结果丢失重复项
Kotlin中提取重复特殊字符段并保留重复项的解决方法
问题场景
- 输入字符串:
"aa..aa..aa...a." - 期望输出:
["..","..","..","."] - 现有错误代码:
var split_string: Set<String> = charsplit.split(re_di).toSet()
- 实际输出:
["","..","."]
问题原因
toSet()导致去重:Set集合本身的特性就是自动剔除重复元素,所以哪怕split()返回的列表里有重复的特殊字符段,转成Set后都会被去重。split()产生空字符串:当正则分隔符出现在字符串开头、结尾,或者连续出现时,split会生成空字符串,这就是输出里有空值的原因。
正确实现方案
方案一:正则匹配目标片段(推荐)
直接用正则匹配所有连续的特殊字符段,这比split更贴合需求:
val input = "aa..aa..aa...a." // 匹配一个或多个连续的.,如果是其他特殊字符,修改正则即可 val specialPattern = Regex("\\.+") val result = specialPattern.findAll(input) .map { it.value } // 提取匹配到的字符串 .toList() println(result) // 输出: [.., .., ..., .]
如果需要匹配多种特殊字符(比如., #, !),只需调整正则表达式:
val multiSpecialPattern = Regex("[.,#!]+") val result = multiSpecialPattern.findAll(input).map { it.value }.toList()
方案二:修正split实现(仅作参考)
如果一定要用split,需要去掉toSet()并过滤空字符串:
val input = "aa..aa..aa...a." // 用非特殊字符作为分隔符,这里以非.为例 val separatorRegex = Regex("[^.]+") val result = input.split(separatorRegex) .filter { it.isNotEmpty() } // 过滤空字符串 .toList() println(result) // 输出: [.., .., ..., .]
内容的提问来源于stack exchange,提问作者Dev Rathod
相关产品推荐
相关产品推荐

