日付を判定する正規表現

Pocket

日付を8桁の数列で表示するケースがあります。2015年2月5日ならば「20150205」とするような場合です。
逆に8桁の数列が日付かどうか判定する方法を考えます。
JavaScriptの正規表現を使います。

\d{8}

単純に数字8桁の場合です。「\d」は数字で「[0-9]」と同じです。「{8}」は前の字が8個連続するという意味です。
これだと「12345678」がOKとなるので、さすがに使えません。

(19|20)\d{6}

仕事で使うならば最近の日付ですし、古くても、せいぜい、生年月日でしょう。
となれば1900年から2099年までに当てはまるから「19」もしくは「20」から始まって数字6桁が続く場合を考えます。
ただし、これも実際には使えないでしょう。

(19|20)\d\d[01]\d[0-3]\d

1900年から2099年までは同じです。
月は「01」から「12」までなので1桁目は「0」か「1」です。
日は「01」から「31」までなので1桁目は「0」から「3」までです。
これは結構使えそうです。

(19|20)\d\d(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])

月は「01」から「09」までは、1桁目が「0」、2桁目が「1」から「9」までです。「10」から「12」までは、1桁目が「1」、2桁目が「0」から「9」までです。
日も同様に1桁目が「0」、「1」と「2」、「3」の場合に分けて設定します。
これはかなり使えると思います。
ただし、いわゆる大の月、小の月を考慮していないので、「20150230」「20150431」などがOKとなります。

(19|20)\d\d(((01|03|05|07|08|10|12)(0[1-9]|[12]\d|3[01]))|((04|06|09|11)(0[1-9]|[12]\d|30))|(02(0[1-9]|[12]\d)))

date

月と日は大の月、小の月、2月に分けて、組み合わせています。
しかし、長く複雑で使いにくい上、閏年は判定できませんから不充分です。
厳密にやるならば、正規表現ではなく、一度、日付オブジェクトに変換し、8桁の数列に戻して、一致するかどうかで判定するのが現実的でしょう。

function is_date_eight(text) {
    var m, dateobj, datestr;
    m = text.match(/(\d{4})(\d{2})(\d{2})/);
    if(m != null) {
        dateobj = new Date(m[1], m[2] - 1, m[3]);
        datestr = dateobj.getFullYear() * 10000 +
            (dateobj.getMonth() + 1) * 100 +
            dateobj.getDate();
        if(m[0] == datestr.toString(10)) {
            return true;
        }
    }
    return false;
}

[ 2015年2月5日 | カテゴリー: JavaScript | タグ: , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報