Java中的split()方法是如何工作的?

5
我的问题是为什么下面这个程序会出现问题:
// Java program to demonstrate working of split(regex,
// limit) with high limit.
public class GFG
{
    public static void main(String args[])
    {
        String str = "geekss@for@geekss";
        String [] arrOfStr = str.split("s", 5);
    }
}

将字符串"geekss@for@geekss"分割成5个子字符串:{"geek", "", "@for@geek", "", ""}。我认为应该有4个子字符串:{"geek", "","@for@geek", ""}。请问有人能澄清我的疑惑吗?


3
你能否解释一下为什么你预期会得到不同的结果? - shmosel
4个回答

4
如果您仔细查看文档:
该方法返回的数组包含此字符串的每个子字符串,这些子字符串由与给定表达式匹配的另一个子字符串终止或由字符串末尾终止。
因此,您的结果数组包含两件事:
1. 由s后面的子字符串组成的字符串(斜体部分) 2. 字符串末尾剩下的任何内容(粗体部分)
您之所以得到前四个元素为{"geek", "", "@for@geek", ""}是因为它们后面跟着s。最后一个""是在匹配每个s之后剩下的内容。
请注意,您传递的限制参数5也是相关的。根据文档:
如果限制n大于零,则模式最多将应用n-1次,数组的长度不会超过n,并且数组的最后一个条目将包含最后匹配的分隔符之后的所有输入。
因此,最后一个匹配的分隔符是末尾的s。在此之后,仍有一个未检查的空字符串。

您的最后一句话并没有很好地解释正在发生什么。 - Tim Biegeleisen
@TimBiegeleisen,编辑后是否更好了?我只是试图用不同的方式解释这个问题。 - Sweeper
@AshutoshTiwari 如果您认为某个答案回答了您的问题,请考虑通过单击该复选标记接受它! - Sweeper
那之后就没有空字符串需要检查了。 - Tim Biegeleisen
@TimBiegeleisen 我的意思是一个索引。你的回答也表明了这一点。 - Sweeper

2
以下是所发生事情的图示解释:
^geek s  s @for@geek s  s  $
 geek |""| @for@geek |""|""

在最终分隔符和$之间的位置被视为一个空字符串匹配。请注意,如果您的字符串以s开头,您还将捕获一个空字符串。
我们看到5个匹配项的微不足道的原因是因为您的分割限制大于或等于5,但仅此并不能解释输出结果。

@Marvin 不,我认为我的观点很清楚。限制只是意味着应用模式5次,它并没有解释我们为什么会得到这些匹配。 - Tim Biegeleisen
@Marvin,原帖明确要求“根据我的理解应该有4个子字符串”,并解释为什么末尾有两个空字符串匹配。我已经回答了这个问题。 - Tim Biegeleisen
@Marvin 如果这真的是问题,那么原帖应该被踩,因为只需要查看Javadoc就可以在10秒内回答。 - Tim Biegeleisen

1
Split("s", 5)会找到4个s字符,并返回5个子字符串,这些子字符串是两个连续的's'之间存在的任何内容,因此为空子字符串,或者从字符串开头到第一个's'以及从最后一个's'到字符串结尾。所以你有5个子字符串。
如果您查看@tobias_k非常有用的评论,您会发现有4个's'字符而不是5个,在split方法中的第二个参数(数字5)告诉我们如果我们移除's'会有多少个子字符串,对于4个's',有5个子字符串,如果您尝试使用大于5的任何数字,您将得到相同的结果,因为没有其他可分割的子字符串。

3
只有4个s,没有5个。 - tobias_k
刚刚检查了一下,数字5是指子字符串而不是字母's',所以对于4个s 5个子字符串存在,如果我们把4放在5的位置上,它不会破坏最后一个子字符串,感谢您的评论!!! - coder

0

你的字符串是"geekss@for@geekss",如果你把's'作为分隔符,你会得到:

"geek" + ['s'] + "" + ['s'] + "@for@geek" + ['s'] "" + ['s'] + ""

所以你有["geek", "", "@for@geek", "", ""]

也许让你困惑的部分是最后一个空字符串。 请记住,分隔符始终“包含”在字符串中。 因此,如果它出现在字符串的末尾,实际上被认为是 "your_string" + your_delimiter + ""

如果你的字符串以"s"开头,同样的情况也会发生:在这种情况下,你的拆分数组的第一个元素将是""。


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