我的问题是为什么以下程序:
// 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", ""}
。有人可以澄清我的怀疑吗?
答案 0 :(得分:4)
如果仔细查看文档:
此方法返回的数组包含此字符串的每个子字符串,其中由与给定表达式匹配的另一个子字符串终止,或者由字符串结束。
所以结果数组包含两件事:
s
(斜体部分)前四个元素获得{"geek", "", "@for@geek", ""}
的原因是因为它们后跟s
。您获得的最后一个""
是匹配每个s
后剩下的内容。
请注意,您传递的limit
5
参数也是相关的。根据文档:
如果限制n大于零,那么模式将最多应用n - 1次,数组的长度将不大于n,,并且数组的最后一个条目将包含除最后一个匹配之外的所有输入分隔符。强>
所以最后一个匹配的分隔符是最后的s
。之后仍然有一个尚未检查的空字符串。
答案 1 :(得分:2)
以下是对正在发生的事情的图解说明:
^geek s s @for@geek s s $
geek |""| @for@geek |""|""
最终分隔符与$
之间的位置计为空字符串匹配。请注意,如果您的字符串以s
开头,您还会选择一个空字符串。
我们碰巧看到5场比赛的微不足道的原因是因为你的分区限制大于或等于5,但仅凭这一点并不能解释输出。
答案 2 :(得分:1)
Split("s", 5)
找到4个字符并返回5个子字符串,这两个子字符串是两个顺序's'
之间存在的任何子字符串,因此是空的子字符串,或者从字符串的开头到第一个字符串#s;'从最后的'直到弦的结尾。所以你有5个子串。
如果你看一下@ tobias_k非常有用的评论你有4个' chars而不是5,split方法中的第二个参数(数字5)告诉我们删除s有多少个子字符串,4 s有5个子字符串,如果你尝试使用大于5的任何数字,你会得到相同的结果,因为没有要拆分的其他子串。
答案 3 :(得分:0)
你的字符串是“geekss @ for @ geekss”,所以如果你认为's'是你的分隔符,你会得到:
“极客”+ ['s'] +“”+ ['s'] +“@ for @ geek”+ ['s']“”+ ['s'] +“”
所以你有["geek", "", "@for@geek", "", ""]
也许令你困惑的部分是最后一个空字符串。
认为分隔符始终“包含”在字符串中。
因此,如果它发生在它的末尾,它实际上被认为是
"your_string" + your_delimiter + ""
。
如果您的字符串以“s”开头,也会发生同样的情况:在这种情况下,您的split数组的第一个元素将是“”。