こんにちは、TARと申します。
ある文字列を日付として評価できるかどうかを判定する方法を知りたいです。
例えば、次のような文字列があるとします。
にせんよねん
2004/02/19
20040219
にがつじゅうくにち
日付と評価できるのは、2行目と3行目の文字列です。
何か良い方法をご存知の方はいらっしゃらないでしょうか。
どんな条件を満たせば日付と見なせるのかを明らかにしてください。
# おそらくは正規表現でなんとかなるのでしょうけど
επιστημηさんも言われていますが、
まずはきちんとした条件を洗い出す(洗い出しているなら提示する)べきだと思います。
基本的にはその条件に則って地道にチェックする事になるのではないかと思います。
ところで、正規表現で表現できるのはわかるんですが、
正規表現を使ってチェックする方法ってありましたっけ?
JRE32.DLLとか使うのだろうか?
後学の為にぜひ。
>どんな条件を満たせば日付と見なせるのかを明らかにしてください。
こんな書き方でいいのかわかりませんが、以下条件です。
条件1)文字列は全て半角数字とする
条件2)年月日、年月、月日の3通りの組み合わせのみ日付と認める
条件3)年、月、日を半角記号で区切ることを認める
例)20040219、2004/02/19、2004-02-19、2004_02、02-19
文字列を分解して判別するしかないのでしょうか。
正規表現には明るくないので他の方向から行きますと...
条件4)抽出した年、月、日が範囲内か判定
を加えて、条件の通りにコーディングすれば良いですが...
> 文字列を分解して判別するしかないのでしょうか。
それ以外の方法を模索していらっしゃるのですよね。
でも、それしか思い浮かびません(ToT)
> 正規表現で表現できるのはわかるんですが
それすらも分かりません(ToT)
じゃあ書き込むなよ>オレ
>条件3)年、月、日を半角記号で区切ることを認める
> 例)20040219、2004/02/19、2004-02-19、2004_02、02-19
半角記号の種類は限定できないの?
+*/@#$%&なども半角記号だと思いますけど?
にせんよねん2004/02/19にがつじゅうくにち
や
にせんよねん2004/02/192004021
023002292004/02/1920040219
のように1行でなっていることは無いの?
>半角記号の種類は限定できないの?
>+*/@#$%&なども半角記号だと思いますけど?
すいません、説明不足でした。
半角記号は、「/」「-」「_」の3種類です。
>にせんよねん2004/02/19にがつじゅうくにち
>や
>にせんよねん2004/02/192004021
>023002292004/02/1920040219
>のように1行でなっていることは無いの?
そういうことはないです。
例で申し訳ありませんが、日付と判断できる文字列は「20040219」「2004/02」「02_19」で、
日付と判断できない文字列は「にせんよねん」「不要-19」「02/VC++」といった
単純な文字列しかありません。
現在、文字列を分解して、それを解析して判断する方法をとっています。
もし、正規表現等、他に良い方法があればご一報いただけるとたいへん助かります。
ある文字が数字なら N, /-_のいずれかなら S, それ以外なら O に変換すると、
日付であれば NNNNNNNN, NNNNSNN NNSNN なんてのに一致するから...
なんていうオチャラカなのはダメですか?
数値の妥当性チェックも必要ですよね。
2004-02-29はOKだけど、
2005-02-29はNGとか。
私だったら地道にオートマトンの図を描きますが。
結局、地道にやるしかないみたいですね。
まあ、考え方ですが、
取り合えず、これは絶対駄目と言うパターンからチェックして
引っかかったらエラーにする。(例えば、二バイト文字があったらアウトとか)
その網の目をかいくぐってきたらフォーマットチェックをする。
(/._と数字の並び方、桁数等)
フォーマットチェックがOKなら日付としての正当性チェックをする。
てな具合でしょうか。
話はそれますが、
正規化表現は覚えといて損は無いです。
GREPする時なんかかなり重宝ですし。
あいや、正規化表現じゃなくて正規表現だった。(T-T)
おっと、見逃してましたごめんなさい。
> ところで、正規表現で表現できるのはわかるんですが、
> 正規表現を使ってチェックする方法ってありましたっけ?
> JRE32.DLLとか使うのだろうか?
> 後学の為にぜひ。
C++で使える正規表現ライブラリ、ということかしら?
有名どころでは boostとICU あたりでしょうか。
みなさん、貴重なご意見ありがとうございました。
たいへん勉強になります。
JRE32については、実際に使ってみます。
現在、文字列を1文字ずつ分解して解析する方法でうまくいっています。
とりあえずこのままでいいのかな(^^;