本帖最后由 黄秋 于 2012-2-14 06:24 编辑
LS的说得具体仔细,却没揣摩一下LZ的心思:
String s[] = str.split(" ",27) ; // 按照空格拆分,如果不写角标位的话,实际结果就没有处理后面那8个空格了
LZ的str.split(" ",27) ,估计是受了substring的影响,因substring 里的 int 参数是字符串索引来的,它以为split 也是,split(" ",27)想象成处理到索引27(或长度27)。
其实遇到问题,先查API --- split(String regex, int limit),刚巧有例子:
limit 参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。如果 n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。
例如,字符串 "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" }
API的说明,要费些神看。limit,split里的 int 参数,那个整数其实就是切割的份数: 2 { "boo", "and:foo" } 就分了两份,: 5 { "boo", "and", "foo" } 想要5份,但最多3份,就分了3份,还有,o 0 { "b", "", ":and:f" } 会“结尾空字符串将被丢弃”。显然,split(" ",27)就是想分27份,如不够27,分完也算了。那么, “不写角标位的话是按什么来划分的?”,查API --- split(String regex)
该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括结尾空字符串。
例如,字符串 "boo:and:foo" 使用这些表达式可生成以下结果:
Regex 结果
: { "boo", "and", "foo" }
o { "b", "", ":and:f" }
可见,str.split(" ") 相当于 str.split(" ",0) ,这个0不是分0份啊,0份那还分来干吗?是“ n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。 ”
为啥String s[] = str.split(" ") ;的话,只处理前面8个空格 --- 后面的空格,也处理了,但因是空格,丢弃了,故看不到。 |