如何分割字符串并在Kotlin的分割部分之间植入分隔符?

Din*_*per 6 split kotlin

说我有一个字符串

"Hello! How do you do? Good day!"

我想分割它,我的分隔符是:?并且! 使用"split"函数,结果将是:

`[Hello, How do you do, Good day]`
Run Code Online (Sandbox Code Playgroud)

但是,我希望它是:

`[Hello, !, How do you do, ?, Good day, !]`
Run Code Online (Sandbox Code Playgroud)

zhu*_*zhu 9

这是Java中的一个类似问题:如何拆分字符串,还要保留分隔符?

使用前瞻.在Kotlin中,代码可能是这样的:

fun main(args: Array<String>) {
    val str = "Hello! How do you do? Good day!"

    val reg = Regex("(?<=[!?])|(?=[!?])")

    var list = str.split(reg)

    println(list)
}
Run Code Online (Sandbox Code Playgroud)

这个输出是:

[Hello, !, How do you do, ?, Good day, !]
Run Code Online (Sandbox Code Playgroud)


vod*_*dan 2

这是我的此类函数的版本:

fun String.splitKeeping(str: String): List<String> {
    return this.split(str).flatMap {listOf(it, str)}.dropLast(1).filterNot {it.isEmpty()}
}

fun String.splitKeeping(vararg strs: String): List<String> {
    var res = listOf(this)
    strs.forEach {str -> 
        res = res.flatMap {it.splitKeeping(str)}
    }
    return res
}

//USAGE:
"Hello! How do you do? Good day!".splitKeeping("!", "?")
Run Code Online (Sandbox Code Playgroud)

它不是很快(平方复杂度),但对于相对较短的字符串效果很好。