Java splitPreserveAllTokens方法行为

Java splitPreserveAllTokens方法行为,java,Java,test2有四个元素 [你好,l,世界] 有两个空元素。 Test1有3个 [你好,l,世界] 这是预期的行为 根据splitPreserveAllTokens的javadoc,以下是合乎逻辑的 String string = "Hello,,l,, World"; String test1[] = string.split(",,"); String test2[] = StringUtils.splitPreserveAllToken

test2有四个元素

  • [你好,l,世界]
有两个空元素。 Test1有3个

  • [你好,l,世界]
这是预期的行为

根据
splitPreserveAllTokens
的javadoc,以下是合乎逻辑的

        String string = "Hello,,l,, World";
        String test1[] = string.split(",,");

        String test2[] = StringUtils.splitPreserveAllTokens(string , ",,");
但我仍然不清楚test2的输出。 请解释test2的其他空元素。

在文档中:

相邻的分隔符被视为空令牌的分隔符

separatorChars-用作分隔符的字符,空格上的null分隔符

这意味着,如果使用“,”或“,”作为第二个参数,则不会有任何区别

结合第一个引号和示例,我假设字符串的开头和结尾都被视为分隔符:

StringUtils.splitPreserveAllTokens(“:cd:ef:”,“:”)
开头和第一个冒号之间有一个(空)标记,第一个冒号和第二个冒号(“cd”)之间有一个标记,第二个冒号和第三个冒号(“ef”)之间有一个标记,最后一个冒号和导致文档显示结果的字符串结尾之间有一个(同样为空):
[“”,“cd”,“ef”,“”]
(拼写正确)

在您的情况下,上面的第二个报价更相关。“,”不作为分隔符处理,而是作为一组分隔符处理。在这种情况下,意思是“,”相当于“,”。然后在第一句话之后,你可以解释你得到的结果:
字符串开头到第一个
:“Hello”
第一个逗号到第二个逗号:“
第二个逗号到第三个:“l”
第三到第四个:“
第四段到最后一段:“世界”

输出:

    String string = "Hello$l$ World";

    String test1[] = string.split("$$");

    String test2[] = StringUtils.splitPreserveAllTokens(string , "$$");
以下是splitPreserveAllTokens的代码

  Test2  [Hello, l,  World]
  Test1  [Hello$l$ World]
//标准案例
而(我=0){
如果(匹配| |保留所有标记){
lastMatch=true;
如果(sizePlus1++==最大值){
i=len;
lastMatch=false;
}
添加(str.substring(start,i));
匹配=假;
}
开始=++i;
继续;
}
lastMatch=false;
匹配=真;
i++;
}
}
这意味着分隔符字符将被视为一组单独的分隔符字符。只要在主字符串上找到任何分隔符,它就会被拆分

与通常的拆分相比,使用此方法的优势是

splitPreserveAllTokens方法隐式处理null

正如这里提到的

在StringUtils中,它使用splitWorker(String str、char separatorChar、boolean preserveAllTokens),它自己的方法是2.0(JDK1.4)的性能调优。


你可以看看源代码,它可能会解释一些事情:是的,它解释了它将字符串按sperator的每个字符分割。但对我来说还是没有意义
  Test2  [Hello, l,  World]
  Test1  [Hello$l$ World]
  // standard case
        while (i < len) {
            if (separatorChars.indexOf(str.charAt(i)) >= 0) {
                if (match || preserveAllTokens) {
                    lastMatch = true;
                    if (sizePlus1++ == max) {
                        i = len;
                        lastMatch = false;
                    }
                    list.add(str.substring(start, i));
                    match = false;
                }
                start = ++i;
                continue;
            }
            lastMatch = false;
            match = true;
            i++;
        }
    }