トップページに戻る    次の正規表現パズルへ    前の正規表現パズルへ

4-3 日付を検索

正規表現パズル

yyyymmdd形式の日付で、
正しい日付を検索する(うるう年を考慮する)

検索前


検索後


対象データ

20060311
20060110
20060228
20060229
20060230
20060231
20060331
20060332
20060430
20060431
20040229
20030229
19960229
19000229
30000229
31000229
32000229
33000229


正規表現

^(?!([02468][1235679]|[13579][01345789])000229)(
([0-9]{4}(01|03|05|07|08|10|12)(0[1-9]|[12][0-9]|3[01]))|
([0-9]{4}(04|06|09|11)(0[1-9]|[12][0-9]|30))|
([0-9]{4}02(0[1-9]|1[0-9]|2[0-8]))|
([0-9]{2}([02468][048]|[13579][26])0229))$


解説

うるう年は、400の倍数の年か、100の倍数でない4の倍数の年なので、
否定先読みを使ってチェックしてます

400の倍数であることをA
100の倍数であることをB
4の倍数であることをC
として、双対の原理を使って


最後の同値変形は、
400の倍数ならば、4の倍数なので
A⇒C
が成立する

2-1 命題が成立した状態での、論理和より
命題 P ⇒ Q
が成立するならば、
P+Q= Q
が成立するので
A+C=C

といった同値変形を行ってます。

ブール代数の知識があれば、
ブール代数の式を、分配法則、結合法則、ドモルガンの法則、双対の原理を使って、
同値変形してから、正規表現を作成したり、
作成した正規表現の、
論理演算の検算に使うことができます

他の方法
他の方法