@@Jonny 5
Ich bin jedenfalls gespannt auf deine "reguläre" Version.
Dann werd ich mal nicht lumpen lassen.
^((0[1-9]|1[0-9]|2[0-8])[./-](0[1-9]|1[0-2])|(29|30)[./-](0[13-9]|1[0-2])|31[./-](0[13578]|1[02]))[./-][0-9]{4}|29[./-]02[./-]([0-9]{2}(0[48]|[2468][048]|[13579][26])|([02468][048]|[13579][26])00)$
Aufgedröselt:
^ # Anfang
(
( 0[1-9] | 1[0-9] | 2[0-8] ) # 01. bis 28. Tag
[./-] # Trennzeichen ('.', '/' oder '-')
( 0[1-9] | 1[0-2] ) # 01. bis 12. Monat
| # oder
( 29 | 30 ) # 29. bis 30. Tag
[./-] # Trennzeichen
( 0[13-9] | 1[0-2] ) # 01. oder 03. bis 12. Monat (nicht Februar)
| # oder
31 # 31. Tag
[./-] # Trennzeichen
( 0[13578] | 1[02] ) # 01., 03., 05., 07., 08., 10.
# oder 12. Monat
)
[./-] # Trennzeichen
[0-9]{4} # Jahr
| # oder
29[./-]02[./-] # 29.02.
(
[0-9]{2} ( 0[48] | [2468][048] | [13579][26] ) # beliebiges Jahrhundert,
# durch 4 teilbares Jahr
# außer volle Jahrhunderte
| # oder
( [02468][048] | [13579][26] ) 00 # durch 4 teilbares Jahrhundert
)
$ # Schluss
Anmerkungen:
-
( )
dienen hier nur zur Klammerung, nicht zum Merken von Teilen. In Implementationen wäre dafür(?: )
zu verwenden. -
Der Ausdruck prüft nicht, ob zwischen Tag/Monat und Monat/Jahr dasselbe Trennzeichen steht. Wie das zu bewerkstelligen wäre, hatte ich damals schon angesprochen.
-
Im Gegensatz zu damals ist dieser Ausdruck nicht für die Ewigkeit, sondern nur für die Jahre 0000 bis 9999. Danach wird die Menschheit bestimmt nicht mehr dieses recht unsinnige Datumsformat verwenden, sondern das wohlgeordnete
yyyy-mm-dd
. -
Zur Validierung eines Datums wird die Menschheit nicht reguläre Ausdrücke verwenden und Zeichenketten untersuchen, sondern die Zahlen prüfen.
LLAP 🖖
“You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
Selfcode:
sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|