2013-04-04 31 views
3

当我编译并运行此代码:Java split()一个由你要分割的字符串构成的字符串?

class StringTest { 
    public static void main(String[] args) { 
     System.out.println("Begin Test"); 

     String letters = "AAAAAAA" 
     String[] broken = letters.split("A"); 
     for(int i = 0; i < broken.length; i++) 
      System.out.println("Item " + i + ": " + broken[i]); 

     System.out.println("End Test"); 
    } 
} 

输出到控制台:

Begin Test 
End Test 

任何人都可以解释为什么split()的作品也是这样吗?我在这里看到其他一些类似的问题,但是并没有完全理解为什么在将字符串分割为完全由您用于regex的字符组成的字符串时没有输出。为什么java这样处理字符串?

+0

另一个注意事项是Java在模式中对待/ A。例如,如果您设置RegEx模式,如下所示。 http://ideone.com/W1sHLH,你会得到另一个有趣的输出。,干杯 – 2013-04-04 16:32:12

+0

@SathishJayapal哦,很酷!谢谢。 – Abaab 2013-04-04 16:35:31

回答

12

String.split丢弃尾部空字符串。例如,"foo,bar,,".split(",")被拆分为{"foo", "bar"}。你看到的是一个完全由分隔符组成的字符串,所以所有空分组都会“尾随”并被丢弃。

你也许可以得到所有这些空字符串,如果你使用letters.split("A", -1)。或者,Guava'sSplitter不会做那样的事情,除非你要求:Splitter.on('A').split(letters)

+0

感谢您的清理!我会在下列情况下接受答案:P – Abaab 2013-04-04 16:25:18

1

这是因为"A"用作分割法分隔符,因为你没有在比分隔符"A"其他的字符串的任何其他文本因此分裂后你一无所有(空字符串不是导致数组中返回)。

1

由于您输入的每一个字符是一个分隔符,发现每串为空。默认情况下,找到的每个尾部空白都会被忽略,因此您看到的是。

然而,split()有两种形式。有一种方法second version of the split()接受另一个int参数limit,它控制的次数的匹配将被应用,但也忽略尾随空白的行为。

如果limit参数是负的,尾随空白将被保留。

如果执行该代码:

String letters = "AAAAAAA"; 
String[] broken = letters.split("A", -1); // note the -1 
System.out.println(Arrays.toString(broken)); 

你得到这样的输出:

{"", "", "", "", "", "", ""} 

更多请见javadoc,包括limit值是如何影响各种行为的例子。