Java';s.split()方法的角案例:它们是什么?
给出答案,请参见下面的——士气:不要单独调用Java';s.split()方法的角案例:它们是什么?,java,split,Java,Split,给出答案,请参见下面的——士气:不要单独调用.split();如果你想要理智的行为,总是给它一个-1的长度参数。但不是0 缔约国声明如下: 此方法返回的数组包含输入序列的每个子字符串,该子字符串由与此模式匹配的另一个子序列终止,或由输入序列的结尾终止 见证这一准则: private static final Pattern UNDERSCORE = Pattern.compile("_"); public static void main(final String... args) {
.split()
;如果你想要理智的行为,总是给它一个-1的长度参数。但不是0
缔约国声明如下:
此方法返回的数组包含输入序列的每个子字符串,该子字符串由与此模式匹配的另一个子序列终止,或由输入序列的结尾终止
见证这一准则:
private static final Pattern UNDERSCORE = Pattern.compile("_");
public static void main(final String... args)
{
System.out.println(UNDERSCORE.split("_").length);
}
现在,参考javadoc,数组应该包含输入的子字符串,它们是(引用):
- “被另一个与此模式匹配的子序列终止”:嗯,有一个——下划线前面的空字符串(显然匹配)李>
- 或者“在输入序列的末尾终止”:还有一个:下划线后面的空字符串
0
。为什么?这是已知的bug吗?(当然可以,请参见下文)还有哪些情况下.split()
不遵守其合同?(同样,见下文)
答案(在解释性文本的正下方)
当使用模式时
,单参数.split()
方法相当于调用带有0
作为参数的双参数方法
这就是问题所在。如果参数为0,则从结果中删除从数组末尾“到”第一个非空元素的所有空字符串
如果,在阅读本文之前,你不知道什么是脑死的设计决策,现在你知道了。更危险的是,这是违约行为
解决方案是始终使用.split()
方法的完整形式,并为其指定一个负长度参数。这里选择-1。在这种情况下,.split()
的行为正常:
private static final Pattern UNDERSCORE = Pattern.compile("_");
public static void main(final String... args)
{
System.out.println(UNDERSCORE.split("_").length);
System.out.println(UNDERSCORE.split("__").length);
System.out.println(UNDERSCORE.split("_x_").length);
System.out.println(UNDERSCORE.split("_", -1).length);
System.out.println(UNDERSCORE.split("__", -1).length);
System.out.println(UNDERSCORE.split("_x_", -1).length);
}
输出:
0 # BUG!
0 # BUG!
2 # BUG!
2 # OK
3 # OK
3 # OK
来自同一文件:
limit
参数控制应用阵列的次数,从而影响结果阵列的长度
如果n[the limit]为零,则该模式将被应用尽可能多的次数,数组可以有任何长度,并且尾部的空字符串将被丢弃
限制的默认值实际上是0
:
该方法的工作原理类似于使用给定的输入序列和零的极限参数调用双参数split方法
因此,将丢弃空字符串
如果需要,请使用下划线.split(“\u”、-1)
,或任何其他负整数
编辑:为了消除混淆:根据您的推理,使用负限制时,返回的数组将是:
[ "" , "" ]
对于非正限制,将删除所有尾随的空字符串。最后一个元素是空字符串,因此它被删除。那么,你有:
[ "" ]
最后一个元素也是空字符串,因此它也被删除
换句话说,trailing不是指初始字符串中的尾随,而是指最终数组中的尾随
另请参见:
不,不匹配-模式前的空字符串与您引用的JavaDoc不匹配。请继续阅读…但是空字符串(在开始处)被另一个与
\uu
匹配的子序列终止…好的,我对后面的空字符串进行了更正。但是对于开头的空字符串,没有理由因为javadoc所说的内容而放弃它。好的,这就解释了它。。。简而言之,为了使.split()
真正遵守其约定,必须使用带-1的双参数形式作为参数。一只虫子…不,不是虫子。你只是误解了合同。您不能仅根据文档的第一段合理地建立期望。虽然第一句话可能更清楚,或者至少规定了(详情见下文)
,但合同是明确的,并得到了遵守。不是一个bug吗?对不起,我不同意。我知道正则表达式做什么,我知道匹配前后的文本是什么;而且.split(0)
除了满足合理的期望之外,什么都做。。。现在我知道我必须.split(-1)
,但我不应该这样做。
[ "" ]