使用String的split方法进行混淆

时间:2014-07-11 16:24:43

标签: java regex string split

我已经浏览了String's split method documentation,但结果并不像预期的那样。当我们将限制参数设置为负值的字符串拆分时,它总是附加一个空值。为什么要这样做?考虑一些案例

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

我期望的是印刷品3。

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

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

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

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

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

这里第一个拆分方法与预期的一样,但为什么第二个方法给出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

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

3 个答案:

答案 0 :(得分:6)

来自JavaDoc for String

  

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

强调我的。

在否定限制的情况下,空的匹配不会被丢弃,所以,如果我用E表示为空:

1#2#3# -> 1 # 2 # 3 # E
E      -> E
#      -> E # E
###    -> E # E # E # E

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

答案 1 :(得分:3)

困扰的主要来源是文档中经常遗漏的部分:

  

...如果n 那么......,尾随空字符串将被丢弃

一旦你知道一切都有意义。

答案 2 :(得分:2)

来自documentation

  

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

似乎负面limit行为已预先定义为最大化匹配,并在结尾处存储任何其他内容。