编译并运行此代码时:
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 :(得分:12)
String.split
会丢弃尾随空字符串。例如,"foo,bar,,".split(",")
会被分割为{"foo", "bar"}
。你所看到的是一个完全由分隔符组成的字符串,所以所有空的分裂都是“尾随”并被丢弃。
如果您使用letters.split("A", -1)
,则可能会获得所有这些空字符串。或者,Guava's Splitter
除非您要求,否则不会执行此类操作:Splitter.on('A').split(letters)
。
答案 1 :(得分:1)
这是因为"A"
在split方法中用作分隔符,因为除了分隔符"A"
之外,你的字符串中没有任何其他文本,因此在分割之后你没有任何东西(空字符串)在结果数组中不返回。)
答案 2 :(得分: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
值如何影响行为的示例。