Вы можете использовать функцию, которую я написал для какого-то предыдущего вопроса, который разделяется по шаблону, сохраняя все совпадающие и не совпадающие подстроки:
private fun splitKeepDelims(s: String, rx: Regex, keep_empty: Boolean = true) : MutableList<String> {
var res = mutableListOf<String>() // Declare the mutable list var
var start = 0 // Define var for substring start pos
rx.findAll(s).forEach { // Looking for matches
val substr_before = s.substring(start, it.range.first()) // // Substring before match start
if (substr_before.length > 0 || keep_empty) {
res.add(substr_before) // Adding substring before match start
}
res.add(it.value) // Adding match
start = it.range.last()+1 // Updating start pos of next substring before match
}
if ( start != s.length ) res.add(s.substring(start)) // Adding text after last match if any
return res
}
Вам просто нужен динамический шаблон из yoyur Pattern
элементов спискасоединяя их с |
, оператором чередования , не забывая экранировать все элементы:
val Pattern = listOf("aaa", """\\""", "\\") // Define the list of literal patterns
val rx = Pattern.map{Regex.escape(it)}.joinToString("|").toRegex() // Build a pattern, \Qaaa\E|\Q\\\E|\Q\\E
val text = """aaaabb\\\\\cc"""
println(splitKeepDelims(text, rx, false))
// => [aaa, abb, \\, \\, \, cc]
См. демонстрационную версию Kotlin
Обратите внимание, что между \Q
и \E
все символы в шаблоне считаются буквальными символами, а не специальными метасимволами регулярных выражений.