私は、ガネーシュとシャルマによる本 oracle_certified_professional_java_se_7_programmer_exams_1z0-804_and_1z0-805 から質問をしていました。
1つの質問は次のとおりです。
次のプログラムを考えて、出力を予測します。
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
イ) 5
ウ 12
エ) 16
これで、 \S は正規表現であり、スペース以外の文字を区切り文字として扱うことを理解しました。しかし、正規表現がどのようにマッチングを行うのか、分割によって生成される実際のトークンは何かについて、私は戸惑いました。
次のようにトークンを出力するコードを追加しました
for (String str: tokens){
System.out.println("<" + str + ">");
}
そして、私は次の出力を得ました
16
<>
< >
<>
< >
<>
<>
<>
<>
<>
<>
<>
<>
< >
<>
<>
< >
そのため、空の文字列トークンがたくさんあります。私はこれを理解していません。
上記のテキストで区切り文字がスペース以外の文字である場合、すべてのアルファベット文字が区切り文字として機能するため、空の文字列にもなるトークンを一致させる場合は、おそらく 21 個のトークンが必要であると考えていました。Javaの正規表現エンジンがこれをどのように機能させているのか理解できません。私のためにこのコードに光を当てることができる正規表現の達人はいますか?