1. ホーム
  2. regex

有効な日付にマッチする正規表現

2023-11-18 03:28:11

質問

私は日付を検証する正規表現を書こうとしています。 正規表現は、次のように一致する必要があります。

  • M/D/YYYYY
  • 西暦MM/DD/YYYY
  • 1 桁の月は、先頭の 0 で始めることができます (例: 2008 年 12 月 3 日)。
  • 1 桁の日数は、先頭の 0 から始めることができます (例: 2008 年 3 月 2 日)
  • 2 月 30 日または 2 月 31 日を含めることはできません (例: 2/31/2008)

今のところ、私は

^(([1-9]|1[012])[-/.]([1-9]|[12][0-9]|3[01])[-/.](19|20)\d\d)|((1[012]|0[1-9])(3[01]|2\d|1\d|0[1-9])(19|20)\d\d)|((1[012]|0[1-9])[-/.](3[01]|2\d|1\d|0[1-9])[-/.](19|20)\d\d)$

これは、2008年2月30日と2008年2月31日を含んでいることを除けば、適切にマッチします。

どなたか良い案をお持ちではないでしょうか?

編集してください。 私が見つけたのは 答え をRegExLibで見つけました。

^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$

MM/DD/YYYY形式に従っている有効な月すべてにマッチします。

皆さん、ありがとうございました。

どのように解決するのですか?

これは正規表現の適切な使い方ではありません。次のような使い方をするとよいでしょう。

[0-9]{2}/[0-9]{2}/[0-9]{4}

といった具合に、上位の言語で範囲をチェックします。