![]() |
RegEx-Formatierung
Hallo ;)
Ich würde gern folgende Datumsangaben via RegEx splitten:
Delphi-Quellcode:
Bisher mache ich das so:
AUG 1917
2 AUG 1917 02 AUG 1917 1917B.C. 1917BC // wird nicht korrekt geparst 1917 B.C. 1917/18 1917/18 B.C. ABT AUG 1917 INT 2 AUG 1917 (Mamas Geburtstag) // hier soll nur alles innerhalb der Klammer geparst werden, wobei Klammern und Inhalt ebenfalls optional sind @#DGREGORIAN@ CAL 17 AUG 1917 // wird nicht korrekt geparst @#DJULIAN@ 02 AUG 1917 // wird nicht korrekt geparst @#DFRENCH R@ 02 VEND 1917 // wird nicht korrekt geparst @#DHEBREW@ 02 TIS 5250 // wird nicht korrekt geparst ^(@#D(GREGORIAN|JULIAN|HEBREW|FRENCH\s*R)@)?\s*(AB T|EST|CAL|INT)?\s*(\d*)\s*([a-zA-Z]*)?\s*(\d*)?(\s*/)?(\d*)?\s*(BC|B.C.)?\s*(.*)?$ Das Parsen des Kalender Kalender funktioniert allerdings nicht richtig. Ich möchte nur, dass z.B. nur @#DHEBREW@ anstatt @#DHEBREW@ und HEBREW gemacht wird. Was muss ich abändern? LG |
AW: RegEx-Formatierung
Was meinst du mit "nur ... gemacht wird"?
|
AW: RegEx-Formatierung
Zitat:
|
AW: RegEx-Formatierung
Normalerweise ist alles, was zwischen ( und ) steht, ein gefundener Unterausdruck, der in match[i] gemerkt wird. So viele Klammerpaare, soviele mögliche Unterausdrücke.
Lösung 1: Du merkst dir, welche Unterausdrucke dich interessieren (die Numerierung ist statisch, egal ob die Ausdrücke gefunden werden oder nicht). Alternativen müssen natürlich zwischen Klammern stehen, egal, ob du den entsprechenden Unterausdruck brauchst oder nicht. Lösung 2: hängt von der Regex-Implementierung ab. Die meisten Implementierungen, die ich kenne, stellen eine Möglichkeit zur Verfügung, einen geklammerten Teil zu kennzeichnen, sodass der darin gefundene Inhalt nicht als Teilmatch registriert wird. Das müsstest du aber der Dokumentation deiner Regex-Implementierung entnehmen, weil das ist leider in der Sprache nicht genormt. Welche Regex-Routinen verwendest du? |
AW: RegEx-Formatierung
@idefix2: ich nutze die "PCRE library". Das ist eine Perl kompatible Bibliothek.
Du sprichst von Untergruppen (Subgroups, oder). Davon habe ich gehört, verstehe aber deren Verwendung und Implementierung nicht. |
AW: RegEx-Formatierung
In der Hilfe zu PCRE (Syntax specification) steht:
(?:...) non-capturing group
Code:
sollte also funktionieren
^(@#D(?:GREGORIAN|JULIAN|HEBREW|FRENCH\s*R)@)?\s*(AB T|EST|CAL|INT)?\s*(\d*)\s*([a-zA-Z]*)?\s*(\d*)?(\s*/)?(\d*)?\s*(BC|B.C.)?\s*(.*)?$
|
AW: RegEx-Formatierung
Was bei
1917BC // wird nicht korrekt geparst nicht funktionieren soll, ist mir nicht klar. Allerdings sind die Punkte beim B.C. problematisch, die musst du im Regex escapen, weil ein Punkt erkennt jedes beliebige Zeichen als gültig und es würde auch z.B. BIC7 als gültig erkannt werden. also (BC|B\.C\.) Zitat:
Nebenbei: Was soll @#DFRENCH R@ 02 VEND 1917 sein? Vendredi ist doch ein Wochentag und kein Monatsname? Noch was: (\d*)? und (.*)? Da ist das Fragezeichen unnötig, * bedeutet ja 0 mal oder öfter |
AW: RegEx-Formatierung
Zitat:
Zitat:
Code:
Allerdings nach wie vor nicht die folgende Zeile:
^(@#D(?:GREGORIAN|JULIAN|HEBREW|FRENCH\s*R)@)?(?:\s*)(ABT|EST|CAL|INT)?(?:\s*)(\d*)?(?:\s*)(JUN|AUG|VEND|TIS)?(?:\s*)(\d*)?(?:/)?(\d*)?(B\.C\.|BC)?$
Code:
1917/18 B.C.
Zitat:
Kalendersystem (optional) Wird keine dieser Angaben gefunden wird automatisch das Datum als Datum des gregorianischen Kalenders angenommen.
Zitat:
Zitat:
|
AW: RegEx-Formatierung
Ich frage mich, ob es wirklich gescheit ist, ein derart aufwändiges Parsing mit einem einzigen Regex zu erschlagen, oder ob es nicht gescheiter wäre, die doch zum Teil grundverschiedenen Formate separat zu handhaben.
Eine Gruppe (?:\s*) zu bilden bringt gegenüber \s* keinen Vorteil. Ich würde per (?x) die erweiterte Syntax einschalten, dann kannst du im Regex Leerstellen zur besseren Lesbarkeit verwenden, Leerstellen werden dann für das Parsen ignoriert. (\d*)?(?:/)?(\d*)? ist nicht gut. Ich gehe davon aus, dass der Schrägstrich nicht allein auftreten darf, sondern nur als Trennung zwischen zwei Zahlengruppen (Jahreszahlen). Also: (\d+/\d+|\d*) Mit der 2. Alternative deckst du auch den Fall ab, dass das Jahr ganz weggelassen wird, es ist also auch nach dieser Gruppe kein ? nötig. |
AW: RegEx-Formatierung
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz