gpt4 book ai didi

java - Kotlin 和 Java 字符串拆分与正则表达式的区别

转载 作者:IT老高 更新时间:2023-10-28 13:39:49 28 4
gpt4 key购买 nike

如果我们有一个 val txt: kotlin.String = "1;2;3;" 并且喜欢将其拆分为一个数字数组,我们可以尝试以下操作:

val numbers = string.split(";".toRegex())
//gives: [1, 2, 3, ]

尾随的空 String 包含在 CharSequence.split 的结果中.

另一方面,如果我们查看Java Strings,结果是不同的:

val numbers2 = (string as java.lang.String).split(";")
//gives: [1, 2, 3]

这一次,使用 java.lang.String.split ,结果不包括尾随的空 String。鉴于相应的 JavaDoc,此行为实际上是有意的:

This method works as if by invoking the two-argument split method with the given expression and a limit argument of zero. Trailing empty strings are therefore not included in the resulting array.

在 Kotlin 的版本中,0 也是默认的 limit 参数,如文档 here 所述,但是当 java.util.regex.Pattern::splitcalled 时,Kotlin 在内部将 0 映射到负值 -1 :

nativePattern.split(input, if (limit == 0) -1 else limit).asList()

它似乎按预期工作,但我想知道为什么该语言似乎限制了 Java API,因为不再提供 0 的限制。

最佳答案

实现意味着它是 java.lang.String.split 的行为通过 limit = 0 实现这在 Kotlin 中丢失了。实际上,在我看来,它已被删除以实现 Kotlin 中可能选项之间的一致性。

考虑一个字符串 a:b:c:d:和一个模式: .

看看我们可以在 Java 中拥有什么:

limit < 0[a, b, c, d, ]
limit = 0[a, b, c, d]
limit = 1[a:b:c:d:]
limit = 2[a, b:c:d:]
limit = 3[a, b, c:d:]
limit = 4[a, b, c, d:]
limit = 5[a, b, c, d, ] (与 limit < 0 相同)
limit = 6[a, b, c, d, ]
...

似乎 limit = 0选项有些独特:它有尾随 :都没有被附加条目替换,如 limit < 0limit >= 5 , 也不保留在最后一个结果项中(与 1..4 中的 limit 一样)。

在我看来,Kotlin API 提高了这里的一致性:在某种意义上,没有特殊情况会丢失关于最后一个分隔符的信息,后跟一个空字符串——它要么作为最后一个分隔符留在原地结果项或作为尾随的空条目。

IMO,Kotlin 函数似乎更适合 principle of least astonishment . java.lang.String.split 中的零限制相反,它看起来更像是一个修改方法语义的特殊值。负值也是如此,显然作为 limit 并没有直观的意义,并且如果不深入研究 Javadoc 就不太清楚。

关于java - Kotlin 和 Java 字符串拆分与正则表达式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48697300/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com