hhmm - 正規表現 - java 2014/01/24

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


: