我正在为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个元素。