2

例子:

String s = ":a:b:c:";
s.split(":");
// Output: [, a, b, c]

来自 Java 文档:

The array returned by this method contains each substring of this string that is terminated by another substring that matches the given expression or is terminated by the end of the string.

为什么在没有结束空字符串的地方考虑起始空字符串?起始空字符串以“:”结束,结束空字符串以字符串结尾结束。所以两者都应该列出,不是吗?

4

4 回答 4

6

当您不提供 alimit时,该split方法不会返回尾随的空匹配项。引用 Javadocs:

围绕给定正则表达式的匹配拆分此字符串。此方法的工作方式就像通过使用给定表达式和零限制参数调用双参数拆分方法一样。因此,尾随的空字符串不包含在结果数组中。

如果使用 2 参数版本split,则传入负数限制,返回数组的大小将不受限制;你会得到尾随的空字符串。

如果 n 为非正数,则该模式将尽可能多地应用,并且数组可以具有任意长度。

在这里,我认为 Javadocs 指的是limit当他们说n.

于 2013-05-06T17:04:14.680 回答
2

它的行为与 javadoc中定义的一样。要获取尾随的空字符串,您可以使用另一种拆分方法,该方法采用两个参数

s.split(":", -1);
// Output: [, a, b, c, ]
于 2013-05-06T17:05:52.393 回答
2

如javadocs中所述:

 Trailing empty strings are therefore not included in the resulting array.

.split 还支持第二个参数(limit),它改变默认行为,如下所示:

String s = ":a:b:c:";
s.split(":", 0); //"Default" Split behaviour -->  [, a, b, c]
s.split(":", 1); //Array length == 1 --> [:a:b:c:]
s.split(":", 2); //Array length ==  2 --> [, a:b:c:]
s.split(":", 3); //Array length == 3 --> [, a, b:c:]
s.split(":", -1); //Any length. Trailling empty spaces are not ommited --> [, a, b, c, ]

顺便说一句,Google Guava提供了许多类来加速 Java 开发,例如 Splitter,它们可以满足您的需求:

private static final Splitter SPLITTER = Splitter.on(':')
   .trimResults()
   .omitEmptyStrings();

//returns ["a", "b", "c"]
SPLITTER.split(":a:b::::c:::") 
于 2013-05-06T17:17:54.067 回答
0

在这种方法 中,尾随的空字符串将被丢弃你可以从这里得到详细的想法

于 2013-05-06T17:09:23.307 回答