使用String的split方法进行混淆

Sya*_*m S 4 java regex string split

我已经浏览了String的split方法文档,但结果并不像预期的那样.当我们将限制参数设置为负值的字符串拆分时,它总是附加一个空值.为什么要这样做?考虑一些情况

// Case 1
String str = "1#2#3#";
System.out.println(str.split("#").length); // Prints 3
System.out.println(str.split("#", -1).length); // Prints 4
Run Code Online (Sandbox Code Playgroud)

我期待的是印刷品3.

// Case 2
str = "";
System.out.println(str.split("#").length); // Prints 1
System.out.println(str.split("#", -1).length); // Prints 1
Run Code Online (Sandbox Code Playgroud)

现在因为没有找到匹配,所以通常的无限制拆分方法应该打印0但它创建一个空字符串的数组.

// Case 3
str = "#";
System.out.println(str.split("#").length); // Prints 0
System.out.println(str.split("#", -1).length); // Prints 2
Run Code Online (Sandbox Code Playgroud)

现在我有一个匹配和没有限制参数的拆分方法工作正常.它是我的预期输出,但为什么在这种情况下它不会像情况2那样创建一个空数组?

// Case 4
str = "###";
System.out.println(str.split("#").length); // Prints 0
System.out.println(str.split("#", -1).length); // Prints 4
Run Code Online (Sandbox Code Playgroud)

这里第一个分割方法是预期的,但为什么第二个方法给出4而不是3?

// Case 5
str = "1#2#3#";
System.out.println(str.split("#", 0).length); // Prints 3
System.out.println(str.split("#", 3).length); // Prints 3
System.out.println(str.split("#", 4).length); // Prints 4
Run Code Online (Sandbox Code Playgroud)

现在是具有正限制的最后一个案例.如果正数<=匹配数,则结果与预期一致.但是如果我们给出更高的正限制,它会再次向结果数组附加一个空字符串.

Bor*_*der 6

来自JavaDoc forString

limit参数控制模式的应用次数,因此会影响结果数组的长度.如果限制n大于零,那么模式将最多应用n - 1次,数组的长度将不大于n,并且数组的最后一个条目将包含超出最后匹配分隔符的所有输入.如果n是非正数,那么模式将被应用尽可能多的次数,并且数组可以具有任何长度.如果n为零,那么模式将被应用尽可能多的次数,数组可以具有任何长度,并且将丢弃尾随的空字符串.

强调我的.

在负限制情况下,空匹配不会被丢弃,因此,如果我用空代表E:

1#2#3# -> 1 # 2 # 3 # E
E      -> E
#      -> E # E
###    -> E # E # E # E
Run Code Online (Sandbox Code Playgroud)

在最后一个示例中(带有正限制),只有在丢弃空尾随空格时才会丢弃n == 0.