Как разбить строку и установить разделители между разделенными частями в Котлине?

Скажем, у меня есть строка

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

и я хочу разбить его, с моими разделителями:? и ! используя функцию «split», результатом будет:

 `[Hello, How do you do, Good day]` 

Однако я хочу, чтобы это было:

 `[Hello, !, How do you do, ?, Good day, !]` 

Вот аналогичный вопрос в Java: как разбить строку, но также сохранить разделители?

Используйте lookahead. В Котлине код может выглядеть так:

 fun main(args: Array<String>) { val str = "Hello! How do you do? Good day!" val reg = Regex("(?<=[!?])|(?=[!?])") var list = str.split(reg) println(list) } 

введите описание изображения здесь

Это моя версия такой функции:

 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("!", "?") 

Это не очень быстро (квадратная сложность), но хорошо работает для относительно коротких строк.