具有多个正则表达式的Kotlin .split()

时间:2018-10-10 18:17:32

标签: regex kotlin

  Input: """aaaabb\\\\\cc"""
  Pattern: ["""aaa""", """\\""", """\"""]
  Output: [aaa, abb, \\, \\, \, cc]

如何使用Kotlin中的模式中的模式将 Input 分解为 Output

我发现Regex(“(?? == cha)|(?== cha)”)有助于拆分后保留模式,因此我尝试使用循环,但是有些模式如'\'和'['需要转义反斜杠,因此我无法使用循环进行拆分。

编辑:

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

这是我一直在做的事情,但是不适用于多个正则表达式,如果Input以“ \”结尾,则会在temp末尾添加额外的“”

1 个答案:

答案 0 :(得分:2)

您可以使用我为先前的某个问题编写的函数,该函数按一个模式进行拆分,以保留所有匹配和不匹配的子字符串:

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
}

您只需要从您的Pattern列表项中获取动态模式,只需将它们与{em> alternation运算符 |结合在一起,同时记住要转义所有项目即可 >

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]

请参见How to setup Atom's script to run Python 3.x scripts? May the combination with Windows 7 Pro x64 be the issue?

请注意,在\Q\E之间,模式中的所有字符均被视为文字字符,而不是特殊的正则表达式元字符。