使用空字符串作为分隔符拆分字符串会产生前导空字符串,但不会显示尾随空字符串

时间:2010-12-28 20:23:42

标签: java regex split

假设您在Java中使用此表达式:

"adam".split("")

这告诉Java使用空字符串("adam")作为分隔符来分割""。这会产生:

["", "a", "d", "a", "m"]

为什么Java在开始时包含空字符串,但最后不包含空字符串?使用这个逻辑,结果不应该是:

["", "a", "d", "a", "m", ""]

3 个答案:

答案 0 :(得分:10)

分隔符是正则表达式。正则表达式""在字符串的最开头(a中的adam之前)匹配。 docs州:

  

将此字符串拆分为   给定的正则表达式。

因此,该方法将在a之前分开匹配。文档还说:

  

此方法就像通过调用一样工作   两个参数的分裂方法   给定表达式和限制参数   零。尾随空字符串   因此不包括在内   结果数组。

  

如果n为零   然后该模式将应用为   尽可能多次,阵列可以   有任何长度,尾随空   字符串将被丢弃。“

因此,虽然字符串末尾也会有匹配,但会丢弃将导致的尾随空字符串。因此前导空字符串,但没有尾随空字符串。如果你想要尾随空字符串,只需传递一个负值作为第二个参数:

"adam".split("", -1);

这是有效的,因为来自文档的引用:

  

如果n是非正数,那么模式   将被应用多次   可能,阵列可以有任何   长度。

要回答“为什么中间没有空字符串?”的问题,正则表达式只会在字符串中的每个位置返回一个匹配项。因此,字符串中的两个连续字符之间不能有两个匹配,因此从文档返回我的第一个引号,这些额外的空字符串将不会出现。

答案 1 :(得分:6)

查看split方法的API是这样的文本:“因此,结尾数组中不包括尾随空字符串。”

答案 2 :(得分:2)

是的,但“a”和“d”,“d”和“a”,“a”和“m”之间有空字符串。它们也不会出现在返回的数组中。

split()方法删除了该空字符串的其他出现。