java中关于String的split(String regex, int limit) 方法

在n多年之前学习Java的时候我们经常去研究那些模棱两可、不易理解和易混淆的知识点,当时我记得针对以下现象进行讨论过,想想当时实在是不易理解,今天再回去观看发现简单的很,变得很容易理解了:

例如,字符串 "boo:and:foo" 使用这些参数可生成以下结果:

Regex Limit 结果
: 2 { "boo", "and:foo" }
: 5 { "boo", "and", "foo" }
: -2 { "boo", "and", "foo" }
o 5 { "b", "", ":and:f", "", "" }
o -2 { "b", "", ":and:f", "", "" }
o 0 { "b", "", ":and:f" }

在此说明一下,此次是因为同事编写的bug弥补方法就是使用如下代码:

java中关于String的split(String regex, int limit) 方法

看到这个时感觉陌生又熟悉,熟悉是因为知道这个东西,陌生是因为对它在这里的使用持有怀疑态度,在这使用真的可以吗?我得去搞明白啊,结果就是他在这里用的挺对的起码解决了bug,接下来对一开始的那个表格进行说明:

1.limit 参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入(从前往后通过分隔符分割后的元素个数够了n-1次那么最后参与分割的分隔符的后边的内容都会作为数组的最后一个元素;如果最后一个元素为空那么不算入)。

2.如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度(也就是说不用去管有多少个元素,也不用去管有没有空,因为它是变长的并且不会忽视空,将会把空算入里边)。

3.如果 n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。

*****  现在明白了,{ "b", "", ":and:f", "", "" } 第一个“”是因为两个o之间的空数据,第二个也是这个原因,最后一个是将"boo:and:foo"中最后空字符串也算进去的。