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.