3


変数の1つでデータベースから日付フィールドを取得しています。現在、次のコードを使用して、日付が「yyyy-mm-dd」形式であるかどうかを確認しています。

if ( $dat =~ /\d{3,}-\d\d-\d\d/ )

私の質問は、これを達成するためのより良い方法がありますか。

どうもありがとう

4

8 に答える 8

6

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-05-13T11:19:40.223 に答える
4

他の人が指摘したように、これがデータベースの日付フィールドである場合、明確に定義された形式である必要があるため、ツールキットで提供されるような単純な正規表現を使用できます。

ただし、2009-02-30 などの無効な日付を受け入れるという欠点があります。繰り返しますが、DB の日付型フィールドに正常に作成された日付を処理している場合は安全です。

より堅牢なアプローチは、CPAN の多くの Date/Time モジュールの 1 つを使用することです。おそらく Date::Manip が適切な選択であり、特に ParseDate() 関数を確認してください。

http://metacpan.org/pod/Date::Manip

于 2009-05-13T20:31:49.590 に答える
3

どうですか

/\d{2}\d{2}?-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/
于 2009-05-13T11:06:45.923 に答える
2

\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 番目の例の最初の文字を除いて、そこにある文字の妥当性をチェックしません。それが必要な場合は、それを日付解析モジュールに渡し、その出力で論理的な結果を確認するだけで十分です。

于 2009-05-13T11:05:29.063 に答える
1

さて、あなたはから始めることができます:

/\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|30|31)/ 
于 2009-05-13T11:05:35.723 に答える