使用空字符串作为分隔符拆分字符串会产生前导空字符串但没有尾随空字符串

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

"adam".split("") 

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

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

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

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

分隔符是正则表达式。 正则表达式""匹配字符串的最开头(在adama之前)。 文档说明:

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

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

此方法的作用就像通过调用给定表达式和limit参数为零的双参数split方法一样。 因此,结尾的空字符串不包含在结果数组中。

如果n为零,那么模式将被应用尽可能多的次数,数组可以具有任何长度,并且尾随的空字符串将被丢弃。“

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

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

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

如果n是非正数,那么模式将被应用尽可能多的次数,并且数组可以具有任何长度。

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

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

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

split()方法删除该空String的其他出现。