Javaのメモ
文字列分割
String#splitを使うと正規表現で文字列を分割して配列にすることができる。
ところがこれをそのまま使うと区切りに対して項目数が保証されない可能性がある。
ところがこれをそのまま使うと区切りに対して項目数が保証されない可能性がある。
String temp = ",,,a,,";
Arrays.asList(temp.split(","));
=> [, , , a]
こういう文字列を分割するときにきちんと後半にも空文字が入ってて欲しいと思うこともある。
その場合、引数が二つのsplitメソッドで第二引数に負の値を入れると望み通りの結果が得られる。
その場合、引数が二つのsplitメソッドで第二引数に負の値を入れると望み通りの結果が得られる。
Arrays.asList(temp.split(",",-1));
=> [, , , a, , ]
ちなみに第二引数は正の値だと項目の数を保証するように働く。
Arrays.asList(temp.split(",",3));
=> [, , ,a,,]
Arrays.asList(temp.split(",",3)).size();
=> 3
区切りが","だとわかりにくいがサイズを見るとなんとなく分かると思う。
日付形式のチェック
日付形式のチェックを行う場合に java.text.SimpleDateFormat を使うことは普通に考えることだと思う。
ただこのクラスは結構曲者で、余計な文字が入ってきたり、入力の文字数が足りなくても強制的に日付として認識してしまう。(厳密にやる方が厳しいのかもしれないが)
ただこのクラスは結構曲者で、余計な文字が入ってきたり、入力の文字数が足りなくても強制的に日付として認識してしまう。(厳密にやる方が厳しいのかもしれないが)
一応日付のあふれ(2005/01/35 → 2005/02/04)を解析させないようにするには lenient と言うフラグを false にすればよいのだが。
・形式が yyyyMMdd 時
2006013x → 2006年1月3日
2006013 → 2006年1月3日
のような変換もされてしまう。
そこで先輩に相談したところ解析したDateクラスをもう一回フォーマットして元と同じであることを確認すればいいと教えてもらいました。
これは素敵だ!というか自分で気付け!orz
String value = "2006013x";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date date = sdf.parse(value);
String after = sdf.format(date);
とすると、もちろん after は20060103 となるので ''value ≠ after'' と異常な入力と判定できるというわけです。