Vous pouvez utiliser la fonction que j'ai écrite pour une question précédente qui divise par un motif en gardant toutes les sous-chaînes correspondantes et non correspondantes :
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
}
Vous avez juste besoin d'un modèle dynamique de votre part. Pattern
les éléments de la liste en les joignant avec un |
, un opérateur d'alternance en n'oubliant pas d'échapper à tous les objets :
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]
Voir le Démonstration Kotlin
Notez qu'entre \Q
y \E
tous les caractères du motif sont considérés comme des caractères littéraux, et non pas comme des métacaractères spéciaux de la regex.