正規表現:「日付」の表現方法

最終更新:2018-07-27 by Joe

正規表現で「日付」を表す方法をまとめました。

「日付」の正規表現

日付を表す正規表現をまとめました。日付はどのような表現の日付かにあわせて正規表現を調整する余地があります。

下記で、いくつかの例を検討してみます。ここでは、デリミタには一律「#」を用いる事にしますが、お好みで構いません。

YYYY/MM/DD の日付

年4桁、月が2桁、日が2桁で考えられる、最も雑な正規表現パターンは下記のようなものです。

// YYYYMMDD
#\d{4}/\d{1,2}/\d{1,2}#

// マッチする文字列
2018/12/20
2011/1/11

// これもマッチ・・・。
0000/00/00
9999/99/99

「\d」は半角の数字を表すのでしたね。また、{n, m}は直前のパターンの繰り返し回数の範囲(回以上、m回未満)です。

ちなみに、デリミタに「#」を利用しているので、スラッシュはエスケープ不要です。

実在する日付のみマッチする表現?

例として入力をバリデーションしましょう。上記の例からもう少し絞り込む事が可能です。

1900年の1月1日から、21000年12月31日まで、日付のみ許可してみます。月と日付の10の位をゼロで詰めを禁止して、マッチします。[0-9]は文字クラスで、0~9の範囲の半角数字1文字を表現できるのでした。

// 1900/1/1 ~ 2099/12/31 の日付
#(19[0-9]{2}|20[0-9]{2})/([1-9]|1[0-2])/([1-9]|[12][0-9]|3[01])#

// マッチする文字列
2018/12/20

// マッチしない文字列
123/11/11
2013/23/34

 

しかしながら、上記は「2000/2/31」の実在しない日付もマッチしてしまいますね。うるう年を考えると、正規表現のみで全てをフィルターしようとしない方法を考えるほうが現実的でしょう。

「日付」は厳密さを求めると、かなり複雑な正規表現が必要になります。

複雑な正規表現はより高度な知識やテストの時間を必要としてしまいますので、自分ですべてを行おうとせずとも、どこかで用途に適した完成度の高い正規表現を見つけ出すか、もしくは、状況に応じて「取り扱いやすい範囲」で調整するのが良さそうです。

参考:Stack overflow: Regex to match Date

「日付」と言っても、記述の方法がいろいろあるね。マッチすべきパターンは具体的などのようなものなのか、しっかり考えるほうが良さそうだね。

正規表現の日付の参考情報

正規表現の基本とサンプル集ををまとめています。