今回やりたかったこと
条件:入力を「◯◯\r\n△△\r\n□□」とする。
結果:以下のように表示される。
◯◯
△△
□□
考え:「\r\n」を認識して、String配列に変換できれば良いかな…?
ということで、こんなコードを作ってみます。
Wrong.java
class Wrong { public static void main(String[] args) { String[] sentence = args[0].split("\r\n") for(int i=0;i<sentence.length;i=++){ System.out.println(i + 1 + "行目は " + sentence[i] + " です"); } } }そして、これに、
java Wrong 最初の行\r\n次の行\r\n最後の行
と入力すると、
1行目は 最初の行\r\n次の行\r\n最後の行 です。
と表示されてしまい、残念ながら、文字列の分割が行われず…。
ということで「きっと『\』をエスケープしてないことが原因なんだ!」と思い、リトライ。
Wrong.java
class Test { public static void main(String[] args) { String[] sentence = args[0].split("\\r\\n") for(int i=0;i<sentence.length;i=++){ System.out.println(i + 1 + "行目は " + sentence[i] + " です"); } } }
こうすることで、きちんとエスケープされて「\r\n」と認識してくれるはず…!
と思ったけど、またしても
1行目は 最初の行\r\n次の行\r\n最後の行 です。
と表示されてしまい、失敗。
デバッグで一つ一つ見ていくと、標準入力された「\r\n」はエスケープされ
「\\r\\n」としてargs[0]に入力されるらしい。
その「\\」をそれぞれエスケープしないといけないので…
Correct.java
class Correct { public static void main(String[] args) { String[] sentence = args[0].split("\\\\r\\\\n") for(int i=0;i<sentence.length;i=++){ System.out.println(i + 1 + "行目は " + sentence[i] + " です"); } } }
とすることで、きちんと、
1行目は 最初の行 です。 2行目は 次の行 です。 3行目は 最後の行 です。
となってくれました。