Java/Kotlin中如何通过可重复的分隔符拆分字符串

4
我正在使用可重复的分隔符拆分字符串,同时也需要保留这些分隔符。
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]

1
为什么不直接匹配所有 x+|o+ - bobble bubble
1
@bobblebubble 其中一个原因是,如果输入的字符串不仅包含 xo,它将无法工作。然而,这个问题中的字符串只包含 xo,所以这个模式将对这个字符串起作用。 - Wiktor Stribiżew
@WiktorStribiżew 我是在评论示例字符串和问题,其他都只是你的猜测。如果这是任务,我认为使用环视过于复杂化了。 - bobble bubble
2个回答

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

4

实际上,在Java的正则表达式模式中,不应该在回溯引用内使用+量词,这不是一个文档支持的特性。它不会抛出异常,因为在内部被转换{1,0x7FFFFFFF},而Java的正则表达式支持有限宽度的回溯引用模式。然而,在回溯引用和前瞻中使用此量词并没有任何区别,因为它们都是非消耗模式,并且正则表达式引擎仍然检查字符串中的每个位置以进行模式匹配。

你可以使用

(?<=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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接