Java split()一个由你要拆分的String组成的String?

时间:2013-04-04 16:20:39

标签: java regex string 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会以这种方式处理字符串?

3 个答案:

答案 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值如何影响行为的示例。