java 拆分结果未知

java split with unknown result

对于以下代码,

  1. 为什么2,3,5,6,8位置有空串?

  2. 那为什么"b",":andf","1"后面没有空串呢?

    String[] splitStrs = "booo:and:fooo1o".split("o", -1);  
    System.out.println(splitStrs.length);  
    for (int i=0; i<splitStrs.length; i++) {  
        System.out.println("\"" + splitStrs[i]+ "\"");  
    }

输出为:

8
"b"
""
""
":and:f"
""
""
"1"
""

why there is empty string in position 2,3,5,6,8?

在“o”上拆分时,“ooo”中的 o 之间没有任何内容,因此是空字符串。

then why "b", ":andf", "1" has no empty string behind?

但是 输出末尾有一个空字符串,即在“1”后面。

根据 documentation,负数第二个参数具体表示“未丢弃尾随空字符串”。

始终阅读文档。

Public String [ ] split ( String regex, int limit ) Parameters:

regex – a delimiting regular expression

Limit – the resulting threshold

limit参数可以有3个值:

  • limit > 0 – 如果是这种情况,则该模式将应用于 最多 limit-1 次,结果数组的长度不会超过 比 n,并且结果数组的最后一个条目将包含所有输入 超过最后一个匹配的模式。
  • limit < 0 – 在这种情况下, pattern 将被应用尽可能多的次数,结果 数组可以是任意大小。
  • limit = 0 – 在这种情况下,模式将 被应用尽可能多的次数,得到的数组可以是 任何大小,尾随的空字符串都将被丢弃。

请访问 GeeksforGeeks site 了解更多关于拆分的信息。

"booo:and:fooo1o".split("o", -1);

why there is empty string in position 2,3,5,6,8?

由于限制是 -1 我们可以将它拆分任意次。当 'o' 用作正则表达式时,它将给出它之前的所有值,因为它没有值 returns empty string

then why "b", ":andf", "1" has no empty string behind?

没有空字符串,因为 'o' 上一个匹配后有字符。

看这个例子:

class Split{
    public static void main(final String ... $){
        var out = System.out;
        final String s = "ooa";
        for(final String str : s.split("o", -1))
            out.println("\""+str+"\"");

    }
}

输出:

$ javac Split.java && java Split
""
""
"a"

为什么这样输出?

当第一次匹配发生时 @ index 0 这也是第一个字符并且它之前是 returns 字符串但是因为没有字符串它 returns 一个 空字符串 .

然后当第二次匹配发生时 o @index 1 它 returns 第一个匹配之后和索引 1 之前的字符串。因为没有字符它 returns 一个 空字符串 .

在那之后 returns a.

split 方法将找到所有需要字符的地方(在您的示例中为“o”),在当前“o”和下一个“o”之间放置一个新的(子)字符串,不带“ o" 字符,在数组中,并继续整个字符串。

如果有,例如“oo”,它将是“”,因为这 2 个“o”字符之间没有任何内容。

我们举个例子。你有一个字符串“哦,你好安娜!我从 2010 年代就没见过你了!”并将此字符串拆分为“a”字符的每个位置。

首先,从第一个字符开始,然后找到下一个字母“a”在哪里,在第14个索引处找到。从开始到“a”所在的地方取一部分字符串并将其添加到数组中。数组的第一个元素看起来像“哦,你好,安”(“A”和“a”是不同的字符)。然后从我找到的那个“a”开始(第 14 个索引)并找到下一个“a”,在我们的示例中它位于第 20 个索引中。从第一个和第二个“a”中取出一部分字符串并将其复制到一个数组中。然后这个过程一直持续到字符串的末尾。

结果将是:

"Oh, hello Ann"
"! I h"
"vent seen you since 2010s!"

如果我们在每个“n”上拆分相同的字符串,使用相同的逻辑,我们将得到:

"Oh, hello A"
""
"a! I have"
"t see"
" you si"
"ce 2010s"

我在第二部分得到空字符串的原因是因为在“...Anna...”中,这 2 个“n”字符之间没有任何内容

可以在以下位置找到一些示例:https://www.geeksforgeeks.org/split-string-java-examples/