string - Kotlin:尝试拆分多个空间时的奇怪行为
问题描述
我想在多个空格上拆分一个字符串。
我这样尝试:
val s = "aa q"
val words = s.split("\\s+").also { println(it) } //prints an array with the original string itself (as opposed to 2 strings)
println(words.size) //prints 1
如果我在 Java 中使用相同的正则表达式拆分字符串,我会得到预期的结果:一个包含两个字符串的数组,"aa"
并且"q"
(这是在 intellij 的 Kotlin repl 上尝试过的)
解决方案
尝试使用toRegex()或toPattern()
val s = "aa q"
val words = s.split("\\s+".toRegex()).also { println(it) } // print [aa, q]
println(words.size) //prints 2
这是 描述功能的kotlin 的链接
@Test
fun useRegex() {
//given
val s = "aa q"
//when
val words = s.split("\\s+".toRegex()).also { println(it) } // print [aa, q]
//then
assertEquals(2, words.size)
assertEquals("aa", words[0])
assertEquals("q", words[1])
}
@Test
fun usePattern() {
//given
val s = "aa q"
//when
val words = s.split("\\s+".toPattern()).also { println(it) } // print [aa, q]
//then
assertEquals(2, words.size)
assertEquals("aa", words[0])
assertEquals("q", words[1])
}
@Test
fun useDelimiters() {
//given
val s = "aa q"
//when
val words = s.split("\\s+").also { println(it) } // you find \s+ this is not regexp this is string not found then return [aa q]
val words2 = s.split(" ").also { println(it) } // you must use correctly number of spaces print [aa, q]
//then
assertEquals(1, words.size)
assertEquals("aa q", words[0])
assertEquals(s, words[0])
assertEquals(2, words2.size)
assertEquals("aa", words2[0])
assertEquals("q", words2[1])
}