在Java/Kotlin中使用可重复的分隔符分割字符串



我用一个可重复的分隔符来分隔字符串,还打算保留分隔符。

val str = "xxoooooooxxoxoxooooo"
val reg = Regex("(?<=x+)|(?=x+)")
var list = str.split(reg)
println(list) 

输出是[, x, x, ooooooo, x, x, o, x, o, x, ooooo],尽管我想得到

[xx, ooooooo, xx, o, x, o, x, ooooo]

val str = "xxoooooooxxoxoxooooo"
val reg =  Regex("o+|x+").findAll(str).map { it.value }.toList()
println(reg)
//[xx, ooooooo, xx, o, x, o, x, ooooo]

实际上,在Java的正则表达式模式中的查找表中使用+量词是不正确的,这不是一个文档支持的功能。它不会抛出异常,因为它在内部被转换为{1,0x7FFFFFFF},并且Java的regex支持宽度受限的lookbacking模式。然而,lookbehind和lookahead中的这个量词没有什么区别,因为它们是非消耗模式,regex引擎仍然会检查字符串中的每个位置是否匹配模式。

你可以使用

(?<=x)(?=o)|(?<=o)(?=x)

查看Kotlin演示:

val str = "xxoooooooxxoxoxooooo"
val reg = Regex("(?<=x)(?=o)|(?<=o)(?=x)")
var list = str.split(reg)
println(list) 
// => [xx, ooooooo, xx, o, x, o, x, ooooo]

最新更新