如果我们有一个
val txt: kotlin.String = "1;2;3;"
,想把它分割成数字数组,我们可以尝试以下方法:val numbers = string.split(";".toRegex())
//gives: [1, 2, 3, ]
CharSequence.split
的结果包含尾部空字符串。
另一方面,如果我们看Java String
,结果是不同的:
val numbers2 = (string as java.lang.String).split(";")
//gives: [1, 2, 3]
这次使用 java.lang.String.split
,结果不包括尾随的空 String
。这种行为实际上是有意的,因为相应的 JavaDoc 中写道:
此方法的工作方式就像使用给定表达式和零限制参数调用两个参数的分割方法一样。因此,尾随的空字符串不包含在生成的数组中。
然而,在 Kotlin 版本中,0
也是默认的 limit
参数,正如 here 所记录的那样,但在内部 Kotlin 将其映射为负值 -1
,当调用 java.util.regex.Pattern::split
时 called:
nativePattern.split(input, if (limit == 0) -1 else limit).asList()
看起来它的工作方式是预期的,但我想知道为什么语言似乎限制了Java API,因为不再提供0
的限制。
;(?!$)
或;(?!;* $)
。 - Bubletan