2014年2月23日日曜日

String.splitで標準入力された文字列から改行コードによってStringの配列に分けるコードについて

今回はJavaについてのお話。

今回やりたかったこと
条件:入力を「◯◯\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行目は 最後の行 です。

となってくれました。

0 件のコメント:

コメントを投稿