【发布时间】:2014-10-09 14:21:22
【问题描述】:
我在做 Ganesh 和 Sharma 的 oracle_certified_professional_java_se_7_programmer_exams_1z0-804_and_1z0-805 书中的一个问题。
一个问题是:
考虑以下程序并预测输出:
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); } }a) 0
b) 5
c) 12
d) 16
现在我明白 \S 是一个正则表达式意味着将非空格字符视为分隔符。 但是我对正则表达式如何匹配以及什么是 split 产生的实际令牌。
我添加了如下代码来打印出令牌
for (String str: tokens){
System.out.println("<" + str + ">");
}
我得到以下输出
16
<>
< >
<>
< >
<>
<>
<>
<>
<>
<>
<>
<>
< >
<>
<>
< >
所以很多空字符串标记。 我只是不明白这一点。
我会认为如果分隔符是非空格字符,那么在上面的文本中,所有字母字符都用作分隔符,所以如果我们匹配,也许应该有 21 个标记 也会导致空字符串的标记。我只是不明白 Java 的正则表达式引擎是如何解决这个问题的。是否有任何正则表达式专家可以为我阐明此代码?
【问题讨论】:
-
我试过你的例子,如果你用 \\s 替换 \\S 会更有意义,这可能是一个错字吗?
-
@mreiterer 这是针对认证考试的,为什么他们抛出这样一个棘手的案例会显得很奇怪?他们将正确答案 (16) 作为选择之一,这一事实使得这不太可能是无意的。
-
P.S.如果 21 是其中一个选择,我可能会弄错。
-
嗨,不,它是 \\S 的反义词。这很棘手。