当提供正则时,Java中的string.split()方法究竟如何工作



我正在为OCPJP考试做准备,我遇到了以下示例:

class Test {
   public static void main(String args[]) {
      String test = "I am preparing for OCPJP";
      String[] tokens = test.split("\S");
      System.out.println(tokens.length);
   }
}

此代码打印16.我期望像no_of_characters 1。我只是不明白...

它在Regex引擎中代表S非Whitespace字符的每个"\S"上分配。

因此,让我们尝试在非Whitespace(S)上拆分"x x"。由于可以通过一个字符匹配此正则表达式,让迭代在它们上标记拆分的位置(我们将使用管道|为此)。

  • 'x'非Whitespace吗?是的,让我们标记它| x
  • ' '非Whitespace吗?不,所以我们将其保留为
  • 最后一个 'x'是非惠特太空?是的,让我们标记它| |

因此,由于我们需要在开始和结束时分开字符串,这最初为我们提供结果数组

["", " ", ""]
   ^    ^ - here we split

,由于拖延空字符串被删除,结果将为

[""," "]     <- result
        ,""] <- removed trailing empty string

因此,拆分返回数组["", " "]仅包含两个元素。

顺便说一句。要关闭卸下最后一个空字符串,您需要使用 split(regex,limit),其负值为 split("\S",-1)


现在让我们回到您的示例。如果您的数据,您都在

中分配
I am preparing for OCPJP
| || ||||||||| ||| |||||

这意味着

 ""|" "|""|" "|""|""|""|""|""|""|""|""|" "|""|""|" "|""|""|""|""|""

所以这代表此数组

[""," ",""," ","","","","","","","",""," ","",""," ","","","","",""]  

但是,由于拖动空字符串""被删除(如果它们的存在是由拆分引起的 - 更多信息,请访问:cline.string.split的输出)

[""," ",""," ","","","","","","","",""," ","",""," ","","","","",""]  
                                                     ^^ ^^ ^^ ^^ ^^

您正在获得结果数组,仅包含此部分:

[""," ",""," ","","","","","","","",""," ","",""," "]  

正好是16个元素。

最新更新