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

Ada*_*ter 7 java regex split

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

"adam".split("")
Run Code Online (Sandbox Code Playgroud)

这告诉Java "adam"使用空字符串("")作为分隔符进行拆分.这会产生:

["", "a", "d", "a", "m"]
Run Code Online (Sandbox Code Playgroud)

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

["", "a", "d", "a", "m", ""]
Run Code Online (Sandbox Code Playgroud)

mar*_*cog 10

分隔符是正则表达式.正则表达式""在字符串的最开头(在ain 之前adam)匹配.该文档的状态:

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

因此该方法将在之前的比赛中分开a.文档还说:

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

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

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

"adam".split("", -1);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 不,这不是偶然的; 这种行为是故意从Perl的`split`中复制出来的.但是,Perl不会像Java那样在开头返回空标记.无论使用什么模式,或者指定了什么块限制,目标字符串开头的零长度匹配都不会在Perl的"split"中导致空的前导令牌. (2认同)

jzd*_*jzd 6

查看split方法的API是以下文本:"因此,结尾数组中不包含尾随空字符串."