3

当我编译并运行这段代码时:

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()工作?我在这里看到了一些类似这样的其他问题,但不完全理解为什么在拆分完全由您使用的字符组成的字符串时没有输出 for regex。为什么java以这种方式处理字符串?

4

3 回答 3

12

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

如果您使用letters.split("A", -1). 或者,除非您要求,否则Guava's Splitter不会这样做:Splitter.on('A').split(letters).

于 2013-04-04T16:22:39.507 回答
1

这是因为"A"在 split 方法中用作分隔符,并且由于您的字符串中除了分隔符之外没有任何其他文本,"A"因此在拆分后您将一无所有(结果数组中不返回空字符串)。

于 2013-04-04T16:23:07.683 回答
1

由于输入中的每个字符都是分隔符,因此找到的每个字符串都是空白的。默认情况下,找到的每个尾随空白都会被忽略,因此您会看到什么。

然而,split()有两种口味。该方法的第二个版本split()接受另一个int参数limit,它控制匹配的应用次数,以及忽略尾随空格的行为。

如果limit参数为负,则保留尾随空格。

如果您执行此代码:

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

你得到这个输出:

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

有关更多信息,请参阅javadoc,包括各种limit值如何影响行为的示例。

于 2013-04-04T20:04:40.420 回答