年と月の正規表現は分かりましたが、日付の正規表現が分かりません。年月日の入力をチェックしてエラーを出しているのですが現状のコードだと日付だけ何を打ってもエラーが出ます。分かる方教えて頂きたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/14 02:45
2020/02/14 03:02
2020/02/14 03:03
回答3件
0
ベストアンサー
まぁ完全に妥当電話番号や郵便番号ですらあるので、そりゃ探せば出てきますよね。
閏年を判定する正規表現を構築し、その完全性を理論的に検証 - Qiita
ここからが問題ですが、これを提出された講師はびっくりして問い詰めますよ?
「これをどうやって作ったのか?」とね。
使うからには最低限記事の中身と同じ事をペラペラ答えられるよう勉強しておくべきです。
個人的にはそれは辛いので、
数値に変換して4倍や100倍でチェックしながら判断した方が良いと思います。
js
1function isLeapYear(year) { 2 if (year % 400 == 0) return true; 3 if (year % 100 == 0) return false; 4 if (year % 4 == 0) return true; 5 return false; 6} 7 8[2400, 2300, 2200, 2004, 2001].forEach(function(year){ 9 console.log(isLeapYear(year)); 10}); 11// true 12// false 13// false 14// true 15// false
これなら1分で作れます。
JavaScript流儀ならDate型を利用するのも良いと思います。
js
1// monthだけindexなので数値が1ずれるのに注意 2[2400, 2300, 2200, 2004, 2001].forEach(function(year){ 3 console.log(new Date(year, 1, 29)); 4}); 5// Tue Feb 29 2400 00:00:00 GMT+0900 (日本標準時) 6// Thu Mar 01 2300 00:00:00 GMT+0900 (日本標準時) 7// Sat Mar 01 2200 00:00:00 GMT+0900 (日本標準時) 8// Sun Feb 29 2004 00:00:00 GMT+0900 (日本標準時) 9// Thu Mar 01 2001 00:00:00 GMT+0900 (日本標準時)
閏年の時は28日しかありませんので、
new Date()
で日付を作る時に29日を指定すると+1日されて勝手に3月1日になります。
後は3月になっているか否かをチェックして取り出せば関数化出来ます。
js
1function isLeapYear(year) { 2 return (new Date(year, 1, 29)).getMonth() != 2; 3} 4 5[2400, 2300, 2200, 2004, 2001].forEach(function(year){ 6 console.log(isLeapYear(year)); 7}); 8// true 9// false 10// false 11// true 12// false
因みに業務なら世界中で使われているMoment.jsを選択するケースが多いでしょう。
更に関数型として発展・改良されたLUXONライブラリもあり、どちらを使うかという感じです。
どちらにせよ、日付を放り込んで
正しい日付ですか?と聞いてfalseが帰ってきたら不正な数値と返すだけなので
後々の処理を考えた時は絶対にライブラリ使う方が良いです。
【おまけ】 カイジくんが本当に欲しいのはこっち
年月日の入力をチェックしてエラーを出している
閏年なんてどうでも良いんですよ。
妥当な日付か否かが知りたいんでしょ?
まぁ、これ一択でしょうね。
数値へのキャストはNumberを使いましょう。
js
1// 文字列を数値にしたい 2console.log(Number("2000")); // 2000 3 4function isValidDate(year, month, day) { 5 var d = (new Date(year, month - 1, day)); 6 return year == d.getFullYear() 7 && month - 1 == d.getMonth() 8 && day == d.getDate(); 9} 10 11[2400, 2300, 2200, 2004, 2001].forEach(function(year){ 12 console.log(isValidDate(year, 2, 29)); 13}); 14// true 15// false 16// false 17// true 18// false 19 20// 完全に存在しない不正な日付も繰り上がったりするので 21console.log(new Date(2000, 3, 32)); // Tue May 02 2000 00:00:00 GMT+0900 (日本標準時) 22console.log(isValidDate(2000, 4, 32)); // false
【おまけのおまけ】 エラーが出たら消えないのでそこも分かる方がいらっしゃったら教えて頂きたいです。
JavaScriptが出来る事は
HTMLの構造をA→Bに書き換えることだけです。
壊したらもう元には戻りません。
これはJavaScriptが命令型言語なので指示待ち人間なわけですよ。
指示を出すからには、「妥当な日付になったら戻れ!」という指示が必要になります。
エラーを表示する為にelm.innerHTML = "エラーですよ"
みたいな事をやってますよね?
だから日付が妥当だった場合は、自らの手でelm.innerHTML = ""
と消さなければなりません。
これはjQueryへ移行しても記述が簡素になってちょっと楽になる程度で変わりません。
最終的にはテンプレートを渡して、
「Aの変数を見て、Aの変数が変更されたら勝手に最善の形に書き換わってくれ!」という仕組みを構築するのが終着点です。
これを実現するのがReactやVue.js等のJSフレームワークを駆使した開発です。
恐らく今後の講義として追加されると思うので楽しみにしてください。
投稿2020/02/14 03:05
編集2020/02/14 03:40総合スコア21203
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/14 04:01
2020/02/14 04:12 編集
2020/02/14 04:20
2020/02/14 04:35
2020/03/02 07:39 編集
2020/02/14 05:34 編集
0
日付の正規表現が分かりません。
そもそも論として、年月日が正しいことは、正規表現でチェックするには複雑過ぎます。
正規表現でチェックするのはせいぜい「日付が1~31までの値であること」ぐらいにして、別なルーチンでチェックする、もしくは月日はドロップダウン式にして不適切な値を最初から入力できなくする、ような方策のほうが適当かと思います。
投稿2020/02/14 02:23
総合スコア145952
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/14 02:27
2020/02/14 02:55
0
何でも正規表現を使うことを考える人には直接の回答ではありませんが、参考に。
【JavaScript入門】日付の加算・減算方法まとめ(月またぎ/うるう年)
投稿2020/02/14 02:25
総合スコア16417
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。