Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用空字符串作为分隔符拆分字符串会产生前导空字符串,但不会产生尾随空字符串_Java_Regex_Split - Fatal编程技术网

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

Java 使用空字符串作为分隔符拆分字符串会产生前导空字符串,但不会产生尾随空字符串,java,regex,split,Java,Regex,Split,假设您在Java中有以下表达式: "adam".split("") 这告诉Java使用空字符串(“)作为分隔符拆分“adam”。这将产生: ["", "a", "d", "a", "m"] 为什么Java在开头包含一个空字符串,而不是在结尾?使用这种逻辑,结果不应该是: ["", "a", "d", "a", "m", ""] 查看split方法的API是这样的:“因此,结果数组中不包括尾随空字符串。”是的,但在“a”和“d”、“d”和“a”、“a”和“m”之间有空字符串。而且它们也不会出

假设您在Java中有以下表达式:

"adam".split("")
这告诉Java使用空字符串(
)作为分隔符拆分
“adam”
。这将产生:

["", "a", "d", "a", "m"]
为什么Java在开头包含一个空字符串,而不是在结尾?使用这种逻辑,结果不应该是:

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

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

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


split()。正则表达式
在字符串的最开头匹配(在
adam
a
之前)。国家:

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

因此,该方法将在
a
之前围绕匹配进行分割。文件还说:


此方法通过调用 具有 给定表达式和一个极限参数 零。尾随的空字符串是 因此不包括在 结果数组

如果n为零 然后,该模式将应用为 在可能的情况下,阵列可以 有任意长度,尾随为空 字符串将被丢弃。”

因此,尽管字符串末尾也会有一个匹配项,但会导致的尾随空字符串将被丢弃。因此,将丢弃前导空字符串,但不包含尾随空字符串。如果需要尾随空字符串,只需传递一个负值作为第二个参数:

"adam".split("", -1);
这是可行的,因为文档中有这样的引用:

如果n为非正,则模式 将应用尽可能多的次数 可能,并且阵列可以有任何 长度


回答“为什么中间没有空弦?”,正则表达式将仅返回字符串中每个位置的单个匹配项。因此,字符串中的两个连续字符之间不可能有两个匹配项,因此回到我从文档中引用的第一句话,这些额外的空字符串将不存在。

单词“因此”表示应该引用更多的上下文。回答得很好。真尴尬,我没看文档就被抓住了!“此方法的工作原理类似于使用给定表达式和零限制参数调用双参数拆分方法。因此,结果数组中不包括尾随空字符串。”和如果n为零,则该模式将被应用尽可能多的次数,数组可以有任何长度,尾随的空字符串将被丢弃。“@Adam Paynter别担心。当我第一次读到你的问题时,我不确定。我惊讶地看到它在javadoc中被详细说明。尽管我多次使用这个方法,但我从未注意到。我们知道为什么后面的空字符串被丢弃,而不是前面的空字符串吗?这很公平。但是,如果它丢弃所有其他字符串,为什么它会选择保留第一个空字符串呢?这似乎是一个奇怪的决定。但是空字符串之间有空字符串吗?不,它不会删除其他出现的空字符串,只删除尾随的空字符串。请阅读我的答案以获得详细的解释。它背后有趣的是动机。特别是由于
split(“,10)
在结尾仍然会返回空字符串。@Nikita我猜这一点起初是偶然的,但后来他们不想破坏向后兼容性,所以引入了“If n为非正”部分。不,这不是偶然的;这种行为是故意从Perl的
split
复制的。但是,Perl不会像Java一样在开始时返回空令牌。无论使用什么模式,或者指定了什么块限制,目标字符串开头的零长度匹配都不会在Perl的
split
@alanmore中导致前导标记为空。你是说Java想要复制Pearl的行为,但没有成功吗?@didibus:没错。基本功能本来应该是相同的,但是他们把一些功能搞错了(比如引导空标记),而把其他功能完全忽略了,比如使用捕获组将分隔符(或部分分隔符)作为附加标记。Perl split的许多高级功能不可能在Java中重现,但我看不出它们为什么不能实现捕获的标记(我称之为标记)。在我看来,这是缺少的功能中最烦人的一个。@marcog:哈哈,我害怕把标题写得那么有描述性。。)但是,如果它起作用的话,我倾向于在标题中更具描述性@马可:我很想知道这个标题是否是一个单词(“字符串”)出现次数最多的记录好吧,也许有点过分了。但我评论中的+1表示至少有人喜欢它。:)