请问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

解决方案 »

  1.   

    "b" + "o" + "" + "o" + ":and:f" + "o" + "" + "o" + ""
      

  2.   

    最后一位也算的
    如果你
    String str = "booo:and:foo";
    这样的话,就b和f后面相同了 
      

  3.   

    问题的关键是你给的第二个参数是7,str.split("o",7); 
    如果这样写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才知道的,觉得有些东西只有自己去试试才能真正理解
      

  4.   

    str.split(String, int); 和 str.split(String); 这两个方法是有区别的。多看看JDK,没必要什么都拿出来问
      

  5.   

    str.split(String); == str.split(String, 0);
      

  6.   

    boo:and:foo
    红色o处分割
      

  7.   

    第一次分割成:"b","o:andfoo"
    第二次分割成:"b","",":andfoo"
    第三次分割成:"b","",":andf","o"
    第四次分割成:"b","",":andf","",""(主要是最后一个是o的缘故)
      

  8.   

    {}括号是割出来的东西。
    String str = "{b}{}o{}o{:and:f}o{}o{}";
      

  9.   

    {}括号是割出来的字符串。
    String str = "{b}o{}o{:and:f}o{}o{}";
      

  10.   


    大哥,我就是看不懂JDK Docs啊!Docs里面没有如何划分的规则,只说了些皮毛不痒的话和一些我看不明白的例子!!!
      

  11.   

    split
    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) 
      

  12.   

    举个例子:
    String[] tokens = "a,".split(",", 2);
    得到的是:
    tokens[0] = "a";
    tokens[1] = "";
    所以在最后一个"o"处split的时候,后面还有一个""。
      

  13.   


    关于这个你可以写写正则表达式来测试下另外这里用“转换”这种说话, 感觉欠妥。        // Add remaining segment
            if (!matchLimited || matchList.size() < limit)
                matchList.add(input.subSequence(index, input.length()).toString());
      

  14.   


    这位姐姐说的很好 呵呵
    jdk说的 呵呵
    split("","")根据给定的正则表达式的匹配来拆分此字符串。 
    该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,结果数组中不包括结尾空字符串。 
      

  15.   

    对不起,是我一时疏忽,
    在“3”的情况下应该是这样分的
    str.split("o",3); 
    分割的结果是(b|o|o|:and:foo)
     
    而在“2”的情况下是这样
    str.split("o",2); 
    分割的结果是(b|o|o:and:foo) “2”和“3”指的是匹配次数
      

  16.   

    谢谢24楼亮亮的回复,我现在完全弄明白了这个问题了。谢谢
    其实照亮亮的说法是正确的,但我自己想加上这样一个理解,因为我想这样方便以后看这个帖子的人的理解。
    亮亮的分析中,很容易让人理解为是一个 |  表示一个分隔。其实真正的意思是:两个别   |   间表示一次分隔。因为查看API 后,里面特别注明了当分隔的参数为  N  时,实际的分隔次数最大值为   N -1   次。