一回も披露したことのない豆知識

こんにちは。

コンテンツの日付(手段はもう、いなくなった別の人に作ってもらったので不明)
を抽出し、抽出された値がYYYY/MM/DD 形式になっているのか
チェックをしたいです。

抽出された値は、変数$datechkに入っています
2008/9/23 13:59

そこで、下記のコードで試したのですが、

if($datechk.match(/^\d{4}\/\d{2}\/\d{2}$/)){OK;}else{NG;}

if($datechk.match(/^\ggg年\mm月\dd日$/)){OK;}else{NG;}

if(String($datechk).match(/^ggg年mm月dd日$/)){OK;}else{NG;}

のいずれで実施しても「OK」が返ってきてしまいます。

何をやってもtrueになってしまうので正しく本当に書式チェックが
されてない状態です。

恐れ入りますが、何が問題なのかご指摘頂けませんでしょうか。

また、とある値が文字列なのか、日付型なのか、チェックする方法は
ございますでしょうか。

ご教授お願いしますm(__)m。

A 回答 (3件)

>なるほど、後ろの$の意味がが良くわかりました!


>上記コードの結果は2008/09/02 12:34:56の内、2008/09/02が抽出されるのですね!
抽出されるのは、年、月、日、時、分、秒です

>if(String($datechk).match(/^ggg年mm月dd日$/)){OK;}else{NG;}
エラーは出ないけど、正規表現でggなんてあるの?
>(ちなみに$datechkですが、$をつけないと変数の中身を参照できないと思います。。。)
ってもしかしてPHPと勘違いしてませんか?
質問する前に、以下のような簡単なプログラムを書いて、実行して
なぜ?なに?を確認してみてましょう!

<html>
<script>

var datechk=$datechk='2008/09/02 12:34:56';
day=(datechk.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/));
alert('平成'+(day[1]-1988)+'年'+day[2]+'月'+day[3]+'日 '+day[4]+'時'+day[5]+'分'+day[6]+'秒');
alert(datechk.replace(/^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/,'$1-$2-$3'));
if(String(datechk).match(/^ggg年mm月dd日$/)) alert('ok'); else alert('no');

datechk='h20/09/23';
if(datechk.match(/^[HhSsTtMm]\d{1,2}\/\d{1,2}\/\d{1,2}$/)) alert('和暦です');
if('p20/09/23'.match(/^[HhSsTtMm]\d{1,2}\/\d{1,2}\/\d{1,2}$/)) alert('和暦です'); else alert('何それ');
var s='更新日は、2008/09/23 に行われました';
if(s.match(/.*\d{4}\/\d{1,2}\/\d{1,2}.*/)) alert('西暦年が含まれています');else alert('何それ');
var s='更新日は、2008 / 09 /23 に行われました';
if(s.match(/.*\d{4}\/\d{1,2}\/\d{1,2}.*/)) alert('西暦年が含まれています');else alert('何それ');
</script>
    • good
    • 0
この回答へのお礼

pipi様
折角、取り急ぎのご回答を頂いたにも関わらず、
ご連絡が遅くなり大変申し訳ございませんでした。

小職にとってJavaScriptは始めたばかりのスクリプト言語
でして、思った以上に苦戦しております(現在も(汗))。
なので、このようなご解説を頂き、pipi様のお力に驚き、
感謝の気持ちでいっぱいになりました。

ありがとうございました!

お礼日時:2008/09/28 13:40

>>実はすべてOKじゃなくてすべてNGになっているのでは?


>について、詳細をご指摘頂けますでしょうか。

参照値が'2008/9/23 13:59'
しかし、正規表現では、/^\d{4}\/\d{2}\/\d{2}$/になってます
無理くり日本語にすれば、
文字列の先頭が数字が4個あり、次に/があり、数字が2文字あり、
/があり、数字が2文字で、終了しているものと合っているか?
この表記では、9月の文字が1つだけのとき合致しない。
まして、日は二文字あれば終わりでなければならないのに
時間がある。だからtrueを返えせない!

もし最後の$が無い場合
2008/09/12345678 でも合致してしまう。

なので\d{1,2}を訳すと、数字が1文字以上2文字以下で合致する
つまり9月でも09月でも合致する

ちなみに
alert('2008/09/02 12:34:56'.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/));
でそれぞれの値を配列で返す

 

この回答への補足

pipi様

レスありがとうごあいます。

>2008/09/12345678 でも合致してしまう。
>なので\d{1,2}を訳すと、数字が1文字以上2文字以下で合致する
>つまり9月でも09月でも合致する

>ちなみに
>alert('2008/09/02 12:34:56'.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/));

なるほど、後ろの$の意味がが良くわかりました!
上記コードの結果は2008/09/02 12:34:56の内、2008/09/02が抽出されるのですね!

match関数で使うために、変数に入っている値を強制的に文字列に入れる
(値の中身が何型かわからないので)に入れる方法は下記方法でよろしいでしょうか。


var datechk2=$datechk;
※$datechkには2008/09/02 12:34:56が入っている。

これを下記にあてはめる
alert($datechk.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/));



if(datechk.match(/^\d{4}\/\d{1,2}\/\d{1,2}/)){OK;}else{NG;}

でOKを返す。逆に

if(String($datechk).match(/^ggg年mm月dd日$/)){OK;}else{NG;}

ならNGになる

(ちなみに$datechkですが、$をつけないと変数の中身を参照できないと思います。。。)

との認識で宜しいでしょうか。

補足日時:2008/09/23 20:08
    • good
    • 0

実はすべてOKじゃなくてすべてNGになっているのでは?


その変数のあたまに$をつけるのをやめたほうがよいでしょう。
(他の言語と競合する可能性もあるので)

<script>
var datechk="2008/9/23 13:59";
if(datechk.match(/^\d{4}\/\d{1,2}\/\d{1,2}/)){document.write(0);}else{document.write(1);}
if(datechk.match(/^\d{4}\/\d{2}\/\d{2}$/)){document.write(0);}else{document.write(1);}
if(datechk.match(/^\ggg年\mm月\dd日$/)){document.write(0);}else{document.write(1);}
if(String (datechk).match(/^ggg年mm月dd日$/)){document.write(0);}else{document.write(1);}
</script>

この回答への補足

yambejpさま

こんにちは。早速のご回答ありがとうございます。

>その変数のあたまに$をつけるのをやめたほうがよいでしょう
ご指摘ありがとうございます。
但し、既に別の方が書かれた変数にあらかじめ入っており、
いまのところそこからしか抽出する方法がないので、
下記方法で対応しようと思います。

var datechk2=$datechk;


また、大変恐れ入りますが、
>実はすべてOKじゃなくてすべてNGになっているのでは?
について、詳細をご指摘頂けますでしょうか。

少なくともはじめのコードについては正確なURLはおぼえておりませんが、サンプル集より採用したものであり、問題点が私の力では見つかりません。

if(datechk.match(/^\d{4}\/\d{1,2}\/\d{1,2}/)){document.write(0);}else{document.write(1);}

但し、上記については、秒まで指定してないのに、OKになってしまうのが不思議です。

2行目以降は私のほうで手を加えましたのが、なぜか、値の書式(2008/9/23 13:59)と異なるもの(\ggg年\mm月\dd日)で比較
しようとしているので、NGを返してほしいのですが、
OKになってしまいます。

当方の勉強不足ですが、使用方法含め、誤りのご指摘を頂けませんでしょうかm(__)m。

補足日時:2008/09/23 15:17
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報