Ist das eine Denksportaufgabe oder warum machst Du das mit RegEx?
Ich würde das nämlich als kleine Heuristik programmieren, also à la 'If Pos('HEBREW, text) <> 0 then'.
Regex ist Pos&Co in jedem Fall vorzuziehen, es ist ungleich bequemer. Schau dir an, wieviel Code du brauchst, um nur
Code:
(@#D(?:GREGORIAN|JULIAN|HEBREW|FRENCH\s*R)@)?\s*)
via Programm-Code zu scannen. Als regex ist das ein übersichtlicher, problemslos lesbarer Einzeiler (wobei ich mir ja eher den inneren und nicht den äusseren Klammerausdruck für die Weiterverarbeitung merken würde, wie er es macht). Ein Argument für die Verwendung von pos wäre da nur, dass du pro Programmzeile bezahlt wirst.
Allerdings würde ich derart komplexe Regexe eher aufspalten und dann per Programmlogik verknüpfen, vor allem dort, wo Abhängigkeiten zwichen den verschiedenen Varianten bestehen. Wenn du über einen einzigen Regex Tag, Monat und Jahr extrahieren willst, aber alle drei Angaben optional sind, wird es eben recht haarig. Das NUR mit Regex zu machen halte ich nicht für das Gelbe vom Ei, auch wenn es mit grossem Aufwand sicher möglich ist.