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末尾添加额外的“”
答案 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]
请注意,在\Q
和\E
之间,模式中的所有字符均被视为文字字符,而不是特殊的正则表达式元字符。