Validierungsbefehl umstellen (Datum DE auf EN)

FreddyCollin

Ensign
Registriert
Dez. 2014
Beiträge
236
Habe die Aufgabe einen Validierungsbefehl für das englische Datumsformat (JJ-MM-TT) zu erstellen.
Habe nun nur das deutsche Datumsformat gefunden (TT-MM-JJ) & bin zu blöd den Validierungsbefehl umzustellen:
Code:
^(0?[1-9]|[12][0-9]|3[01])[\.\-](0?[1-9]|1[012])[\.\-]\d{2}$

Könnte mir jemand dabei helfen?
Wär dicke dankbar!
 
Weshalb? Gibts keine Datumsfunktionen in deiner Sprache? Regex ist nicht dafür wirklich geeignet...
 
Leider nicht - ist eine blöde und recht abgespeckte DSL.. :(
Der Validierungsbefehl dient auch eher der Usability als einem klassischen "strengen" Regex
 
Du hast dort 2 geklammerte Gruppen - die eine für Monat, die andere für Tag - und eine 2-stellige Zahl für's Jahr... sollte eigentlich nicht so schwer sein?

Code:
^\d{2}[\.\-](0?[1-9]|1[012])[\.\-](0?[1-9]|[12][0-9]|3[01])$
 
Dann ist erstmal die Frage, was du genau willst. Das was du als JJ-MM-TT angibst ist kein gültiges Datum im Englischen, sondern eher ne Vereinfachung von ISO 8601, welches eigentlich JJJJ beinhaltet. Britisches Englisch besitzt das selbe Format wie das Deutsche TT.MM.JJJJ, amerikanisches Englisch hat das Format MM.TT.JJJJ.

Was für ne Regex Engine liegt dir denn zugrunde?



edit:

Hier mal als Übersicht: https://en.wikipedia.org/wiki/Date_format_by_country

DE: YMD oder DMY
UK: YMD oder DMY
US: YMD oder MDY
 
  • Gefällt mir
Reaktionen: Hayda Ministral und kartoffelpü
@Yuuri danke, sowas wollt ich auch grad schreiben.
Allerdings ist american english MM/TT/JJJJ
 
Usability klingt eher nach Frontend, aber DSL eher nach Backend.
Gibt es nicht irgendwo bei dir im Kontext einen Datums-Typ? Speicherst du das in einer MS/My/PostgreSQL Datenbank?

Korrekte Validierung stelle ich mir recht hakelig vor mit Regexp. Was ist z.B. mit 30-02-20 (TT-MM-JJ)?
 
YY-MM-DD?

Du hast ja prinzipiell schon alles. Die runden Klammern sind jeweils Backreferenzen auf Tag, Monat und Jahr; die Trennzeichen dazwischen werden geprüft, aber nicht berücksichtigt. Natürlich wäre eine Backref für das zweite Trennzeichen sinnvoll gewesen - mit dem Ausdruck ist sowas wie 01.12-44 möglich -- aber grundsätzlich geht es erstmal so.

Also einfach die einzelnen Klammerausdrücke auseinandernehmen und umstellen. Bedenken, daß wenn später die Backrefs verwendet werden sollten, sich deren Belegung auch ändert - der erste Ausdruck bleibt immer der erste Ausdruck, aber im einen Fall ist das der Tag und im anderen das Jahr, was halt am weitesten links steht.


Wobei natürlich grad für Datumswerte ein existierender Datumsparser sinnvoller wäre. Einfach den Text als Datumswert interpretieren lassen und dann gucken, was hinten rauskommt. Grad in Verbindung mit einem Regex macht sich das gut, dann kann man mit dem Regex die Syntax prüfen und mit dem Datumsparser die Semantik -- der Regex wird praktisch IMMER sowas wie 29-02-1999 zulassen, kann man auch nicht viel dagegen tun. Der Datumsparser kann dann je nach verwendeter Sprache entweder einen Fehler werfen (so ein Datum gibt es nicht) oder man muß gucken, ob Input gleich Output, wenn der Parser automatisch das nächste gültige Datum reininterpretiert hat (hier: 01-03-1999). In dem Fall muß $input identisch sein zu sprintf('%d-%d-%d', $date.day,$date.month,$.date.year) -- ist es das nicht, war das Datum syntaktisch korrekt, aber semantischer Blödsinn.
 
  • Gefällt mir
Reaktionen: Mihawk90 und BeBur
Zurück
Oben