web-dev-qa-db-ja.com

正規表現を使用してyyyymmddの日付形式を照合する

正規表現は、YYYYMMDD形式の文字列内の有効な日付と一致する必要があります。例えば、 aaa_20150327_bbbは一致する必要がありますが、aaa_20150229_bbb 2015年はうるう年ではないためです。

20から2099までの年のみを考慮する必要があります。

9
Joe Wang

狂気の合計(年0〜9999)

次のコード( this の回答に基づく)は、0〜9999の間の年数で機能します。

(?<!\d)(?:(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))0229)|(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d)

demo を確認してください)


総狂気簡略化(2000-2099年)

必要な場合は、2000〜2099年の間のみ機能するように単純化できます。

(?<!\d)(?:(?:20\d{2})(?:(?:(?:0[13578]|1[02])31)|(?:(?:0[1,3-9]|1[0-2])(?:29|30)))|(?:(?:20(?:0[48]|[2468][048]|[13579][26]))0229)|(?:20\d{2})(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8]))(?!\d)

しかし、ご覧のとおり、それはそれほど単純ではありません。

demo を確認してください)


正気の道(年*)

健全性を維持するには、非常に単純な正規表現を使用し、コードを使用してそれを検証する必要があります。

(20\d{2})(\d{2})(\d{2})

demo を確認してください)

16
enrico.bacis

私の方法(正気ではない方法)

(((\d{4})(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))|((\d{4})(0[469]|11)(0[1-9]|[12][0-9]|30))|((\d{4})(02)(0[1-9]|1[0-9]|2[0-8]))|([0-9][0-9][02468]40229)|([0-9][0-9][02468]80229)|([0-9][0-9][13579]20229)|([0-9][0-9][13579]60229)|([0-9][0-9][02468]00229))

vb.netを使用(より理解しやすいと思います)

    Dim meses31 As String = "((\d{4})(0[13578]|10|12)(0[1-9]|[12][0-9]|3[01]))"
    Dim meses30 As String = "((\d{4})(0[469]|11)(0[1-9]|[12][0-9]|30))"
    Dim febrero28 As String = "((\d{4})(02)(0[1-9]|1[0-9]|2[0-8]))"
    Dim febrero29 As String = "([0-9][0-9][02468]40229)|([0-9][0-9][02468]80229)|([0-9][0-9][13579]20229)|([0-9][0-9][13579]60229)|([0-9][0-9][02468]00229)"

    Dim patternFecha As String = String.Concat("(", meses31, "|", meses30, "|", febrero28, "|", febrero29, ")")
0
Fran