Чтобы исправить вашу проблему, вы можете заменить свое регулярное выражение на
val regex = """((?<=( #\[[^\]\[]{3,100}] ))|(?=( #\[[^\]\[]{3,100}] )))"""
. \w
можно заменить на [^\]\[]
, что соответствует любому символу, но [
и ]
.
Обратите внимание на использование необработанного строкового литерала, """..."""
, который позволяет использовать одну обратную косую черту в качестве экранирующего выражения.
См. Kotlin online demo .
Кроме того, вы можете использовать следующий метод для разделения и сохранения разделителей:
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
}
Затем просто используйте его как
val str = "this is #[loc_75acca83-a39b-4df1-8c3c-b690df00db62] sparta"
val regex = """#\[[\]\[]+]""".toRegex()
print(splitKeepDelims(str, regex))
// => [this is , #[loc_75acca83-a39b-4df1-8c3c-b690df00db62], sparta]
См. Демонстрационную версию Kotlin .
Шаблон \[[^\]\[]+]
соответствует
\[
- [
char [^\]\[]+
- 1+ символов, отличных от [
и ]
]
- ]
char.