web-dev-qa-db-ger.com

Regex verwenden, um das Datumsformat in yyyymmdd abzugleichen

Der reguläre Ausdruck sollte mit gültigen Daten in einer Zeichenfolge im Format YYYYMMDD übereinstimmen. Beispiel: aaa_20150327_bbb sollte übereinstimmen, aaa_20150229_bbb sollte jedoch nicht berücksichtigt werden, da 2015 kein Schaltjahr ist.

Nur das Jahr ab 2000 bis 2099 muss berücksichtigt werden.

8
Joe Wang

Gesamtwahnsinn (Jahre 0-9999)

Die folgende (basierend auf this answer) arbeitet für Jahre zwischen 0 und 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)

(überprüfen Sie die Demo )


Gesamtwahnsinn vereinfacht (Jahre 2000-2099)

Wenn Sie möchten, können Sie es vereinfachen, um nur zwischen 2000 und 2099 zu arbeiten.

(?<!\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)

Aber wie Sie sehen können, ist es nicht wirklich einfacher.

(überprüfen Sie die Demo )


Der gesunde Weg (Jahre *)

Um Ihren Verstand zu behalten, sollten Sie sich an einen sehr einfachen Regex halten und ihn dann mit Code validieren.

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

(überprüfen Sie die Demo )

14
enrico.bacis

Mein Weg (nicht der gesunde Weg)  

(((\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))

Mit vb.net (einfacher zu verstehen, denke ich) 

    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