空字符串和单个分隔符字符串的字符串分割行为

8

这是对此问题的跟进。

问题在下面的第二行。

"".split("x");   //returns {""}   // ok
"x".split("x");  //returns {}   but shouldn't it return {""} because it's the string before "x" ?
"xa".split("x"); //returns {"", "a"}    // see?, here "" is the first string returned
"ax".split("x"); //returns {"a"}

1
请参见SI-5096,“split()在分隔符出现在字符串末尾时存在错误”。 - 4e6
1
这就是为什么Google Guava创建了com.google.common.base.Splitter。 - Schildmeijer
3个回答

7
不会,因为根据相关的Javadoc,“末尾的空字符串将被丢弃”。

那么为什么它不在第一行被丢弃呢?(在空字符串上分割) - snappy
这应该被理解为“结果数组末尾的空字符串将被丢弃”。 - madth3
我猜它把空字符串视为第一个标记,然后在其后进行分割,因此从技术上讲,它是一个前导空字符串。 - dann.dev
3
再次引用JavaDoc文档:"如果表达式与输入不匹配,则生成的数组只有一个元素,即这个字符串。"也许它并不一致,但它能够按照承诺的方式工作。 - madth3

5
依据 java.util.regex.PatternString.split(..) 方法使用该类。
"".split("x");   // returns {""} - valid - when no match is found, return the original string
"x".split("x");  // returns {} - valid - trailing empty strings are removed from the resultant array {"", ""}
"xa".split("x"); // returns {"", "a"} - valid - only trailing empty strings are removed
"ax".split("x"); // returns {"a"} - valid - trailing empty strings are removed from the resultant array {"a", ""}

2
所以它表现正常是因为它调用的方法...表现出那种方式?我想知道当我用这样的论据关闭下一个错误报告时,我的老板会说什么。 - Kim Stebel
@Kim Stebel,SO既不是一个错误跟踪器,我也不应该为其修复错误。这篇文章基本上是要求澄清,而不是解决方案,我只是试图解释为什么split方法会表现出那种行为。放轻松。 - srkavin

0

如果要包含末尾的空字符串,请使用{{link1:split}}的其他实现。

"".split("x", -1);   // returns {""} - valid - when no match is found, return the original string
"x".split("x", -1);  // returns {"", ""} - valid - trailing empty strings are included in the resultant array {"", ""}
"xa".split("x", -1); // returns {"", "a"} - valid
"ax".split("x", -1); // returns {"a", ""} - valid - trailing empty strings are included in the resultant array {"a", ""}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接