请问b后面有两个o,f后面也有两个o,为什么结果是b后只有一个"",而f后却有两个""呢???谢谢public class Q109 {
public static void main(String args[]){
String str = "boo:and:foo";
String [] tokens = str.split("o",7);
for(int i = 0;i < tokens.length;i ++){
System.out.println("tokens[" + i + "] = " + tokens[i] + ";");
}
System.out.println("tokens.length = " +tokens.length);
}
}输出是:
tokens[0] = b;
tokens[1] = ;
tokens[2] = :and:f;
tokens[3] = ;
tokens[4] = ;
tokens.length = 5
public static void main(String args[]){
String str = "boo:and:foo";
String [] tokens = str.split("o",7);
for(int i = 0;i < tokens.length;i ++){
System.out.println("tokens[" + i + "] = " + tokens[i] + ";");
}
System.out.println("tokens.length = " +tokens.length);
}
}输出是:
tokens[0] = b;
tokens[1] = ;
tokens[2] = :and:f;
tokens[3] = ;
tokens[4] = ;
tokens.length = 5
如果你
String str = "booo:and:foo";
这样的话,就b和f后面相同了
如果这样写str.split("o");
那么分割的结果是(b|oo|:and:f|oo)
tokens[0] = b;
tokens[1] = ;
tokens[2] = :and:f;
tokens.length = 3如果这样写str.split("o",1);
那么分割的结果是(boo:and:foo)
tokens[0] = boo:and:foo;
tokens.length = 1如果这样写str.split("o",2);
那么分割的结果是(b|o|o:and:foo)
tokens[0] = b;
tokens[1] = o:and:foo;
tokens.length = 2如果这样写str.split("o",3);
那么分割的结果是(b|oo|:and:foo)
tokens[0] = b;
tokens[1] = ;
tokens[2] = :and:foo;
tokens.length = 3如果这样写str.split("o",4);
那么分割的结果是(b|o|o|:and:fo|o)
tokens[0] = b;
tokens[1] = ;
tokens[2] = :and:f;
tokens[3] = o;
tokens.length = 4如果这样写str.split("o",5);
那么分割的结果是(b|o|o|:and:f|o|o)
tokens[0] = b;
tokens[1] = ;
tokens[2] = :and:f;
tokens[3] = ;
tokens[4] = ;
tokens.length = 5这些我是看过了API才知道的,觉得有些东西只有自己去试试才能真正理解
红色o处分割
第二次分割成:"b","",":andfoo"
第三次分割成:"b","",":andf","o"
第四次分割成:"b","",":andf","",""(主要是最后一个是o的缘故)
String str = "{b}{}o{}o{:and:f}o{}o{}";
String str = "{b}o{}o{:and:f}o{}o{}";
大哥,我就是看不懂JDK Docs啊!Docs里面没有如何划分的规则,只说了些皮毛不痒的话和一些我看不明白的例子!!!
public String[] 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" } 调用此方法的 str.split(regex, n) 形式与以下表达式产生的结果完全相同: Pattern.compile(regex).split(str, n)
String[] tokens = "a,".split(",", 2);
得到的是:
tokens[0] = "a";
tokens[1] = "";
所以在最后一个"o"处split的时候,后面还有一个""。
关于这个你可以写写正则表达式来测试下另外这里用“转换”这种说话, 感觉欠妥。 // Add remaining segment
if (!matchLimited || matchList.size() < limit)
matchList.add(input.subSequence(index, input.length()).toString());
这位姐姐说的很好 呵呵
jdk说的 呵呵
split("","")根据给定的正则表达式的匹配来拆分此字符串。
该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,结果数组中不包括结尾空字符串。
在“3”的情况下应该是这样分的
str.split("o",3);
分割的结果是(b|o|o|:and:foo)
而在“2”的情况下是这样
str.split("o",2);
分割的结果是(b|o|o:and:foo) “2”和“3”指的是匹配次数
其实照亮亮的说法是正确的,但我自己想加上这样一个理解,因为我想这样方便以后看这个帖子的人的理解。
亮亮的分析中,很容易让人理解为是一个 | 表示一个分隔。其实真正的意思是:两个别 | 间表示一次分隔。因为查看API 后,里面特别注明了当分隔的参数为 N 时,实际的分隔次数最大值为 N -1 次。