如何使用指定多字符Unicode分隔符拆分字符串并保留分隔符?
解决印地语字符串按指定多字符分隔符拆分并保留分隔符的问题
需求说明
将字符串「क्षत्रिय」使用多字符分隔符列表 listOf("श्र","क्ष","त्र","ज्ञ") 拆分,最终得到结果 ["क्ष", "त्र", "ि", "य"],要求保留匹配到的分隔符,且分隔符为多字符组合而非单个字符。
核心思路
- 优先最长匹配:将分隔符按长度降序排序(当前案例中所有分隔符长度一致,若存在更长分隔符可确保优先匹配),避免短分隔符提前匹配导致错误结果。
- 逐位扫描匹配:从字符串起始位置开始,逐个位置尝试匹配分隔符:
- 匹配成功则将该分隔符加入结果集,指针跳过分隔符对应的长度;
- 匹配失败则取当前单个字符加入结果集,指针向后移动1位;
- 重复上述步骤直到遍历完整个字符串。
Kotlin 实现代码
fun splitWithMultiCharDelimiters(input: String, delimiters: List<String>): List<String> { val result = mutableListOf<String>() // 按分隔符长度降序排序,优先匹配更长的分隔符 val sortedDelimiters = delimiters.sortedByDescending { it.length } var currentIndex = 0 while (currentIndex < input.length) { var matched = false // 尝试匹配每个分隔符 for (delimiter in sortedDelimiters) { val delimiterLen = delimiter.length if (currentIndex + delimiterLen <= input.length && input.substring(currentIndex, currentIndex + delimiterLen) == delimiter) { result.add(delimiter) currentIndex += delimiterLen matched = true break } } // 未匹配到分隔符,取单个字符加入结果 if (!matched) { result.add(input.substring(currentIndex, currentIndex + 1)) currentIndex += 1 } } return result } // 测试示例 fun main() { val targetString = "क्षत्रिय" val delimiters = listOf("श्र","क्ष","त्र","ज्ञ") val splitResult = splitWithMultiCharDelimiters(targetString, delimiters) println(splitResult) // 输出: [क्ष, त्र, ि, य] }
结果验证
运行上述代码后,输入字符串「क्षत्रिय」会被依次处理:
- 起始位置匹配到分隔符「क्ष」,加入结果;
- 指针移动至第3位(索引2),匹配到分隔符「त्र」,加入结果;
- 剩余字符「ि」和「य」均不匹配任何分隔符,逐个加入结果;
最终得到目标拆分结果["क्ष", "त्र", "ि", "य"]。
内容的提问来源于stack exchange,提问作者Manishoaham
相关产品推荐
相关产品推荐

