変数の1つでデータベースから日付フィールドを取得しています。現在、次のコードを使用して、日付が「yyyy-mm-dd」形式であるかどうかを確認しています。
if ( $dat =~ /\d{3,}-\d\d-\d\d/ )
私の質問は、これを達成するためのより良い方法がありますか。
どうもありがとう
OWASP Validation Regex Repositoryの、うるう年をサポートする米国形式の日付のバージョン:
^(?:(?:(?:0?[13578]|1[02])(/|-|.)31)\1|(?:(?:0?[1,3-9]|1 [0-2])(/|-|.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2 })$|^(?:0?2(/|-|.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0 [48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^( ?:(?:0?[1-9])|(?:1[0-2]))(/|-|.)(?:0?[1-9]|1\d|2[0 -8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
正規表現ライブラリには、他の提案に沿ったより単純なバージョンが含まれており、問題に変換されています。
^\d{4}-\d{1,2}-\d{1,2}$
他の人が指摘したように、これがデータベースの日付フィールドである場合、明確に定義された形式である必要があるため、ツールキットで提供されるような単純な正規表現を使用できます。
ただし、2009-02-30 などの無効な日付を受け入れるという欠点があります。繰り返しますが、DB の日付型フィールドに正常に作成された日付を処理している場合は安全です。
より堅牢なアプローチは、CPAN の多くの Date/Time モジュールの 1 つを使用することです。おそらく Date::Manip が適切な選択であり、特に ParseDate() 関数を確認してください。
どうですか
/\d{2}\d{2}?-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/
\d は、他の言語の数字と一致する可能性があります。そして、YYY は本当に有効な年ですか? 4 桁、ダッシュ、2 桁、ダッシュ、2 桁でなければならない場合は、/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/
または/^[12][0-9]{3}-[0-9]{2}-[0-9]{2}$/
. 一致させる文字列の前後のスペース文字に注意してください。
もちろん、これは、2 番目の例の最初の文字を除いて、そこにある文字の妥当性をチェックしません。それが必要な場合は、それを日付解析モジュールに渡し、その出力で論理的な結果を確認するだけで十分です。
さて、あなたはから始めることができます:
/\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|30|31)/