AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RegEx-Formatierung

Ein Thema von hansklok · begonnen am 10. Aug 2015 · letzter Beitrag vom 13. Aug 2015
Antwort Antwort
Seite 2 von 3     12 3      
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#11

AW: RegEx-Formatierung

  Alt 11. Aug 2015, 22:39
Code:
(?x) ^  (@#D(?:GREGORIAN|JULIAN|HEBREW|FRENCH\s*R)@  \s*)?    (?:(ABT|EST|CAL|INT) \s*)?  (?:(\d+) \s*)? 
(?:(JUN|AUG|VEND|TIS) \s*)? (\d+/\d+|\d*) \s* (B\.C\.|BC)?  $
Wenn nach dem BC keine Leerstellen folgen dürfen, sonst am Ende vor dem $ nochmal \s*

Die Erklärung zum Aufbau des Datums verstehe ich schon, nicht klar ist mir, was man mit so inhomogenen Datumsangaben in der Folge anfangen kann - aber das musst du wissen

Geändert von idefix2 (11. Aug 2015 um 22:41 Uhr)
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#12

AW: RegEx-Formatierung

  Alt 11. Aug 2015, 22:43
Die Erklärung zum Aufbau des Datums verstehe ich schon, nicht klar ist mir, was man mit so inhomogenen Datumsangaben in der Folge anfangen kann - aber das musst du wissen
http://genwiki.genealogy.net/GEDCOM/DATE-Tag
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#13

AW: RegEx-Formatierung

  Alt 11. Aug 2015, 22:54
ok.

Was noch fehlt, ist die Behandlung des Klartexts in Klammern am Schluss:

Code:
(?:\( ([^)]*) \) \s* )
liefert dir den Text zwischen den Klammern, ohne die Klammern selbst - vorausgesetzt, der Text in den Klammern enthält selbst keine schliessende Klammer. Wenn das auch erlaubt sein soll, wäre es einfach (.*) statt ([^)]*)

Geändert von idefix2 (11. Aug 2015 um 22:58 Uhr)
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#14

AW: RegEx-Formatierung

  Alt 11. Aug 2015, 23:13
Schau mal bitte hier mein Beispielcode http://rubular.com/r/8DBJT9K0tH. Das matcht leider noch nicht alles.
Zumal die dualen Jahresangaben nur gesamt und nicht gesondert gematcht werden. Ich benötige aber jeweils einen Match für 1917 und 18.

Geändert von hansklok (11. Aug 2015 um 23:16 Uhr)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#15

AW: RegEx-Formatierung

  Alt 11. Aug 2015, 23:40
Klar.
Das ? nach dem letzten Klammerausdruck fehlt, deswegen matcht er nur die drei Ausdrücke, die (Muttis Geburtstag) enthalten.
Deshalb: (?:\( ([^)]*) \) \s* )?

Ich denke, es ist einfacher, die verbleibenden Probleme im Programmcode als via Regex zu lösen: Die Unterscheidung, welche Ziffern Jahreszahlen und welche Tage sind, ist im Regex schwierig - da müsste man Riesen Teilausdrücke duplizieren, um die verschiedenen Varianten richtig zu unterscheiden.
Die Jahreszahlen könntest du natürlich getrennt einfangen, dann bekommst du aber DREI verschiedene Ergebnisfelder für "einzige Jahreszahl", "Jahreszahl 1 von 2" und "Jahreszahl 2 von 2" - und ein Teil der Jahreszahl landet u.U. beim Tag, wenn kein Tag angegeben ist. Regex ist gut, aber derart komplexe Fallunterscheidungen sind auf der Programmebene besser aufgehoben.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#16

AW: RegEx-Formatierung

  Alt 12. Aug 2015, 08:30
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'.

Dann kannst Du unit tests schreiben und Probleme in Ruhe dursteppen. Versteh mich nicht falsch: regEx kann das, nur wird das eben irgendwann einmal so kompliziert, dass das micht mehr wartbar ist. Lass doch mal etwas dazukommen. Dann sitzt Du doch tagelang an der Anpassung...
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#17

AW: RegEx-Formatierung

  Alt 12. Aug 2015, 09:20
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.

Geändert von idefix2 (12. Aug 2015 um 09:32 Uhr)
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#18

AW: RegEx-Formatierung

  Alt 12. Aug 2015, 15:00
Ist das eine Denksportaufgabe oder warum machst Du das mit RegEx?
Eine berechtigte Frage. Ich habe das mal mit den bekannten Springfunktionen gemacht, aber da in einer GEDCOM-Datei dutzende Datumsangaben vorkommen und so eine Datei mal schnell 10000-1000000 Zeilen haben kann, dachte ich, ich nehme RegEx, da das parsen da deutlich schneller vonstatten geht.
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.
Du sagst es.

Nun bisher wird ja auch nur eine Datumsangabe gepasst. Bedacht wurde noch nicht, dass es in Gedcom-Datumsangaben auch Doppeldatierung gibt:
Code:
BET 17 AUG 1917 AND CAL 21 AUG 1918
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#19

AW: RegEx-Formatierung

  Alt 12. Aug 2015, 18:21
Ein Fallstrick sind die "optionalen" Werte und die Abhängigkeiten.
Wenn ich es richtig verstehe, sind je nach Datumstyp unterschiedliche Monatsnamen möglich. Dann ist noch die Frage, ob du überprüfen musst, dass das zusammenpasst, oder ob du dich darauf verlassen kannst. Im zweiten Fall ist es einfacher, denn da kannst du per Regex auch Kombinationen erlauben, die keinen Sinn machen, und die man deswegen als ungültig verwerfen müsste.

Ein weiteres Problem sind die
Code:
\s*
, denn irgend eine Trennung zwischen den Zahlen brauchst du: Also zumindest entweder Monatsnamen (Buchstaben) oder Leerstellen, oder beides, um Zifferngruppen zu trennen. Das muss auch in die Regex Logik hinein, sonst landet, wie in ein paar der Beispiele, ein Teil der Jahreszahl in dem Feld, in dem du den Tag erwartest. Im nachhinein per Programm, wie ich in einem Post weiter oben geschrieben habe, ist es wahrscheinlich gar nicht mehr möglich, das sauber auseinanderzudividieren.


Vielleicht ist es zielführend, erst einfache regexausdrücke zu definieren und den kompletten regex aus diesen einfacheren ausdrücken zusammenzusetzen:

const
einfachesdatum = '.....'; // was auch immer
datumsbereich = '(?:BET\s+' + einfachesdatum + '\s+AND\s+' + einfachesdatum + ')';
datum = '(?:' + datumsbereich + '|' + einfachesdatum + ')';

etc.

Eine andere Idee, um das Parsen zu vereinfachen, wäre, erst einmal den String durchzugehen und prinzipiell überall, wo Buchstaben und Zahlen unmittelbar aufeinanderfolgen, eine Leerstelle einzufügen. Dann kannst du im Regex Trennzeichen zwischen den Gruppen zwingend voraussetzen, mit \s+ statt \s* wird das Erkennen der Pattern stabiler und wahrscheinlich auch schneller.

Geändert von idefix2 (12. Aug 2015 um 18:30 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#20

AW: RegEx-Formatierung

  Alt 12. Aug 2015, 20:40
Regex ist Pos&Co in jedem Fall vorzuziehen, es ist ungleich bequemer.
Findest Du wirklich dieses RegEx-Monstrum 'bequemer'? Würdest Du bei einer Aufgabe dieser Art *wirklich* das Forum bemühen müssen, wenn Du die 'Code'-Methode verwenden würdest?
Zitat:
Schau dir an, wieviel Code du brauchst...via Programm-Code zu scannen.
Wenig Code != Viel Qualität.
Zitat:
Ein Argument für die Verwendung von pos wäre da nur, dass du pro Programmzeile bezahlt wirst.
Wir werden dafür bezahlt, effizient und qualitativ hochwertig zu programmieren. Wir wählen also immer die Methode, die für die Aufgabenstellung am besten geeignet ist. So sehr ich RegEx mag und auch oft einsetze, würde ich davon abraten, wenn ich mehrere Tage benötigte, um den Ausdruck zu formulieren. Das passt irgendwie nicht.
Zitat:
Allerdings würde ich derart komplexe Regexe eher aufspalten und dann per Programmlogik verknüpfen,
Das ist doch mal ein Vorschlag.

Nicht falsch verstehen: RegEx an sich ist schon das richtige Mittel. Nur wenn es für den Programmierer zu komplex wird, wäre eine alternative Vorgehensweise durchaus in Erwägung zu ziehen.

Wenn Du das so hinbekommst, und auch bei Änderungen und Erweiterungen des Ausdrucks keine Probleme bekommst, super. Ich würde hier vermutlich doch etwas grübeln. Zeit ist Geld und daher nehme ich die Lösung, die langfristig am besten ist. Wobei ich mich neulich auch ertappt habe, ein RegEx zu finden, der bei einem SQL-Skript alle nicht deklarierten Variablen findet. Das war auch nicht ohne....

Geändert von Dejan Vu (13. Aug 2015 um 07:52 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz