hhmm - 正規表現 - java
2014/01/24
java
時間
正規表現
javaです。正規表現です。
ある程度の規模のシステムに開発で途中から入ると、既にいろいろユーティリティクラスが用意されていて、よくも悪くも「頭」を使わずコーディングできたりします。
歴史のあるシステムのソースですと、おいそれ、ソースを改良したいと声を誰もあげないものです。一般的に《正しくないかも》というロジックでも、それを使って《正しく》動いている場合は、それを変えてはいけないのが《お約束》です。《正しくないもの》を《正しく動かすためのロジック》が組まれてたりするので、単体でみたときに正しく動くようにすると、《全体として正しくなく》なってしまう可能性があります。(悲哀)
というわけで、0〜23時0〜59分という時間、hhmm形式の時間かどうかチェックを行う正規表現を使って考えてみます。
正規表現を使わないコードですと、intとかに数値変換して、範囲チェックするという方法もあるでしょう。
僕が最初に、おこなったアプローチは、正規表現とjavaのロジックを使う折衷案でした。
こんな感じ
static public boolean checkHHMM(String t) {
if (t == null || t.length() != 4) {
return false;
}
String hh = t.substring(0, 2);
if (!hh.matches("[0-1]{1}[0-9]{1}") && !hh.matches("[2]{1}[0-3]{1}")) {
return false;
}
String mm = t.substring(2, 4);
return mm.matches("[0-5]{1}[0-9]{1}");
}
次に、正規表現だけでできないかなーと調べて模索した方法
static public boolean checkHHMM_2(String t) {
if (t == null || t.length() != 4) {
return false;
}
return t.matches("([0-1][0-9]|[2][0-3])[0-5][0-9]");
}
で、簡単な比較、前者のロジックは、そんなにまちがったアプローチではないと思う。
正規表現のみのアプローチは若干自信がない.....
参考にしたサイトはあるけど、そのままは使ってはいないです。
public class TestRegular {
public static void main(String[] args) {
a();
}
static void a() {
String[] ss = { null, "1", "AA00", "9999", "0000", "0099", "1010",
"2400", "2359", "2360", "1799", "9000","0001","3001","0010","0060","1900"};
for (String s : ss) {
System.out.println(s + ":" + checkHHMM(s));
System.out.println(s + ":" + checkHHMM_2(s));
System.out.println();
}
System.out.println();
}
static public boolean checkHHMM(String t) {
if (t == null || t.length() != 4) {
return false;
}
String hh = t.substring(0, 2);
if (!hh.matches("[0-1]{1}[0-9]{1}") && !hh.matches("[2]{1}[0-3]{1}")) {
return false;
}
String mm = t.substring(2, 4);
return mm.matches("[0-5]{1}[0-9]{1}");
}
static public boolean checkHHMM_2(String t) {
if (t == null || t.length() != 4) {
return false;
}
return t.matches("([0-1][0-9]|[2][0-3])[0-5][0-9]");
}
}
最後に実行した結果
null:false
null:false
1:false
1:false
AA00:false
AA00:false
9999:false
9999:false
0000:true
0000:true
0099:false
0099:false
1010:true
1010:true
2400:false
2400:false
2359:true
2359:true
2360:false
2360:false
1799:false
1799:false
9000:false
9000:false
0001:true
0001:true
3001:false
3001:false
0010:true
0010:true
0060:false
0060:false
1900:true
1900:true
: