Java - split(regex, limit) 方法实际上是如何工作的?

plu*_*010 5 java string split

我试图了解 split 方法是如何工作的,并且对此有点困惑。在 oracle 文档页面中给出的这个示例中,

String str = "boo:and:foo";

String[] str1 = str.split("o",2);

Output
 b
 o:and:foo
Run Code Online (Sandbox Code Playgroud)

这很容易理解,字符串在第一个 'o' 出现时被逐字分割

但对于

String[] str1 = str.split("o",3);

Output:
b

:and:foo 
Run Code Online (Sandbox Code Playgroud)

这是怎么出来的?

YCF*_*F_L 5

我从文档中了解到:

limit 参数控制应用模式的次数,因此会影响结果数组的长度。如果限制 n 大于零,则该模式将最多应用 n - 1 次,数组的长度将不大于 n,并且数组的最后一个条目将包含最后一个匹配的分隔符之外的所有输入。如果 n 为非正数,则该模式将被应用尽可能多的次数,并且数组可以具有任意长度。如果 n 为零,则该模式将被应用尽可能多的次数,数组可以具有任意长度,并且将丢弃尾随的空字符串。

这意味着在字符串 s 上设计或削减它为 n 次,所以让我们一一分析以更好地理解:

限制 1

String[] spl1 = str.split("o", 1);
Run Code Online (Sandbox Code Playgroud)

这意味着在字符串上的一个字符串上拆分或剪切它,o在这种情况下,您将获得所有输入:

[boo:and:foo]
 1
Run Code Online (Sandbox Code Playgroud)

限制 2

String[] spl1 = str.split("o", 2);
Run Code Online (Sandbox Code Playgroud)

这意味着切一次,o所以我会在第一个休息一下o

    boo:and:foo
-----^
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将得到两个结果:

[b,o:and:foo]
 1 2
Run Code Online (Sandbox Code Playgroud)

限制 3

String[] spl1 = str.split("o", 3);
Run Code Online (Sandbox Code Playgroud)

这意味着在第一次o和第二次切两次o

    boo:and:foo
1----^^--------------2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将获得三个结果:

[b, ,:and:foo]
 1 2  3
Run Code Online (Sandbox Code Playgroud)

限制 4

String[] spl1 = str.split("o", 4);
Run Code Online (Sandbox Code Playgroud)

这意味着在第一次、第二次和第三次切三遍 o

     boo:and:foo
1_____^^      ^
       |___2  |___3
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将获得四个结果:

[b, ,:and:f,o]
 1 2 3      4
Run Code Online (Sandbox Code Playgroud)

限制 5

String[] spl1 = str.split("o", 5);
Run Code Online (Sandbox Code Playgroud)

这意味着在第一次,第二次,第三次和第四次切四次 o

     boo:and:foo
1_____^^      ^^
       |___2  ||___4
              |____3
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将获得五个结果:

[b, ,:and:f, , ]
 1 2  3     4 5
Run Code Online (Sandbox Code Playgroud)

只是一个简单的动画来了解更多:

split() 方法实际上是如何工作的?