我的问题是,为什么有以下节目:
// 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", ""}。有人能澄清我的疑虑吗?
发布于 2017-10-08 11:08:53
如果你仔细看医生:
此方法返回的数组包含该字符串的每个子字符串,该子字符串由与给定表达式匹配的另一个子字符串终止,或者在字符串的末尾终止。
因此,您的结果数组包含两件事:
s (斜体部分)您为前四个元素获得{"geek", "", "@for@geek", ""}的原因是因为它们后面跟着s。最后得到的""是匹配每个s后剩下的部分。
请注意,您传递的limit参数5也是相关的。根据文件:
如果限制n大于零,则模式最多将被应用n-1次,数组的长度将不大于n,和数组的最后一项将包含最后匹配分隔符以外的所有输入。
因此,最后匹配的分隔符是最末尾的s。在此之后,仍然有一个空字符串尚未检查。
发布于 2017-10-08 11:05:52
下面是对正在发生的事情的图解:
^geek s s @for@geek s s $
geek |""| @for@geek |""|""最后定界符和$之间的位置被计算为空字符串匹配。注意,如果您的字符串是以s开头的,那么您也会得到一个空字符串。
我们碰巧看到5个匹配的原因是因为您的拆分限制大于或等于5,但这本身并不能解释输出。
发布于 2017-10-08 11:04:57
Split("s", 5)查找4s字符,并返回两个序列's'之间存在的任何子字符串,即空子字符串,或从字符串开始到字符串的第一个字符,以及从字符串的最后一个到字符串的末尾。所以你有5个子子。
如果您查看@ tobias_k非常有用的注释,您有4个字符,而不是5个,拆分方法中的第二个参数(数字5 )告诉我们如果移除s有多少子字符串,对于4s有5个子字符串,如果尝试使用大于5的任何数,则得到相同的结果,因为没有其他子字符串要拆分。
https://stackoverflow.com/questions/46630316
复制相似问题