Kotlin .split () с несколькими регулярными выражениями - PullRequest
0 голосов
/ 10 октября 2018
  Input: """aaaabb\\\\\cc"""
  Pattern: ["""aaa""", """\\""", """\"""]
  Output: [aaa, abb, \\, \\, \, cc]

Как я могу разделить Ввод в Вывод с использованием шаблонов в Шаблон в Kotlin?

Я обнаружил, что Regex ("(? <= cha) | (? = cha) ") помогает шаблонам оставаться после разделения, поэтому я попытался использовать циклы, но некоторые шаблоны, такие как '\' и '[', требуют обратной косой черты, поэтому я невозможность использовать цикл для разделения. </p>

РЕДАКТИРОВАТЬ:

  val temp = mutableListOf<String>()
  for (e in Input.split(Regex("(?<=\\)|(?=\\)"))) temp.add(e)

Это то, что я делал, но это не работает для нескольких регулярных выражений, и это добавляет дополнительные "" вконец временного интервала, если ввод заканчивается на "\"

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете использовать функцию, которую я написал для какого-то предыдущего вопроса, который разделяется по шаблону, сохраняя все совпадающие и не совпадающие подстроки:

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 все символы в шаблоне считаются буквальными символами, а не специальными метасимволами регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...