文字列を日付かどうか評価したい – プログラミング – Home

文字列を日付かどうか評価したい
 
通知
すべてクリア

文字列を日付かどうか評価したい


TAR
 TAR
(@TAR)
ゲスト
結合: 22年前
投稿: 15
Topic starter  

こんにちは、TARと申します。

ある文字列を日付として評価できるかどうかを判定する方法を知りたいです。
例えば、次のような文字列があるとします。

  にせんよねん
  2004/02/19
  20040219
  にがつじゅうくにち

日付と評価できるのは、2行目と3行目の文字列です。
何か良い方法をご存知の方はいらっしゃらないでしょうか。


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

どんな条件を満たせば日付と見なせるのかを明らかにしてください。
# おそらくは正規表現でなんとかなるのでしょうけど


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

επιστημηさんも言われていますが、
まずはきちんとした条件を洗い出す(洗い出しているなら提示する)べきだと思います。
基本的にはその条件に則って地道にチェックする事になるのではないかと思います。

ところで、正規表現で表現できるのはわかるんですが、
正規表現を使ってチェックする方法ってありましたっけ?
JRE32.DLLとか使うのだろうか?
後学の為にぜひ。


返信引用
TAR
 TAR
(@TAR)
ゲスト
結合: 22年前
投稿: 15
Topic starter  

>どんな条件を満たせば日付と見なせるのかを明らかにしてください。

こんな書き方でいいのかわかりませんが、以下条件です。

条件1)文字列は全て半角数字とする
条件2)年月日、年月、月日の3通りの組み合わせのみ日付と認める
条件3)年、月、日を半角記号で区切ることを認める
    例)20040219、2004/02/19、2004-02-19、2004_02、02-19

文字列を分解して判別するしかないのでしょうか。


返信引用
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

正規表現には明るくないので他の方向から行きますと...
条件4)抽出した年、月、日が範囲内か判定
を加えて、条件の通りにコーディングすれば良いですが...
> 文字列を分解して判別するしかないのでしょうか。
それ以外の方法を模索していらっしゃるのですよね。
でも、それしか思い浮かびません(ToT)

> 正規表現で表現できるのはわかるんですが
それすらも分かりません(ToT)

じゃあ書き込むなよ>オレ


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>条件3)年、月、日を半角記号で区切ることを認める
>    例)20040219、2004/02/19、2004-02-19、2004_02、02-19

半角記号の種類は限定できないの?
+*/@#$%&なども半角記号だと思いますけど?

にせんよねん2004/02/19にがつじゅうくにち

にせんよねん2004/02/192004021
023002292004/02/1920040219
のように1行でなっていることは無いの?


返信引用
TAR
 TAR
(@TAR)
ゲスト
結合: 22年前
投稿: 15
Topic starter  

>半角記号の種類は限定できないの?
>+*/@#$%&なども半角記号だと思いますけど?

すいません、説明不足でした。
半角記号は、「/」「-」「_」の3種類です。

>にせんよねん2004/02/19にがつじゅうくにち
>や
>にせんよねん2004/02/192004021
>023002292004/02/1920040219
>のように1行でなっていることは無いの?

そういうことはないです。
例で申し訳ありませんが、日付と判断できる文字列は「20040219」「2004/02」「02_19」で、
日付と判断できない文字列は「にせんよねん」「不要-19」「02/VC++」といった
単純な文字列しかありません。

現在、文字列を分解して、それを解析して判断する方法をとっています。
もし、正規表現等、他に良い方法があればご一報いただけるとたいへん助かります。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

ある文字が数字なら N, /-_のいずれかなら S, それ以外なら O に変換すると、
日付であれば NNNNNNNN, NNNNSNN NNSNN なんてのに一致するから...

なんていうオチャラカなのはダメですか?


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

数値の妥当性チェックも必要ですよね。
2004-02-29はOKだけど、
2005-02-29はNGとか。

私だったら地道にオートマトンの図を描きますが。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

結局、地道にやるしかないみたいですね。

まあ、考え方ですが、
取り合えず、これは絶対駄目と言うパターンからチェックして
引っかかったらエラーにする。(例えば、二バイト文字があったらアウトとか)

その網の目をかいくぐってきたらフォーマットチェックをする。
(/._と数字の並び方、桁数等)

フォーマットチェックがOKなら日付としての正当性チェックをする。

てな具合でしょうか。

話はそれますが、
正規化表現は覚えといて損は無いです。
GREPする時なんかかなり重宝ですし。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

あいや、正規化表現じゃなくて正規表現だった。(T-T)


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

おっと、見逃してましたごめんなさい。

> ところで、正規表現で表現できるのはわかるんですが、
> 正規表現を使ってチェックする方法ってありましたっけ?
> JRE32.DLLとか使うのだろうか?
> 後学の為にぜひ。

C++で使える正規表現ライブラリ、ということかしら?
有名どころでは boostとICU あたりでしょうか。


返信引用
TAR
 TAR
(@TAR)
ゲスト
結合: 22年前
投稿: 15
Topic starter  

みなさん、貴重なご意見ありがとうございました。
たいへん勉強になります。
JRE32については、実際に使ってみます。

現在、文字列を1文字ずつ分解して解析する方法でうまくいっています。
とりあえずこのままでいいのかな(^^;


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました