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
hansklok

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

RegEx-Formatierung

  Alt 10. Aug 2015, 21:12
Hallo

Ich würde gern folgende Datumsangaben via RegEx splitten:
Delphi-Quellcode:
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
Bisher mache ich das so:
^(@#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
  Mit Zitat antworten Zitat
idefix2

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

AW: RegEx-Formatierung

  Alt 10. Aug 2015, 22:53
Was meinst du mit "nur ... gemacht wird"?
  Mit Zitat antworten Zitat
hansklok

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

AW: RegEx-Formatierung

  Alt 10. Aug 2015, 23:17
Was meinst du mit "nur ... gemacht wird"?
Naja, jetzt gibt es sowohl ein Match, welches @#DHEBREW@ ausgibt und als zweiten Match eben DHEBREW. Ich möchte aber nur DHEBREW ausgegeben bekommen.
  Mit Zitat antworten Zitat
idefix2

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

AW: RegEx-Formatierung

  Alt 11. Aug 2015, 08:06
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?

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

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

AW: RegEx-Formatierung

  Alt 11. Aug 2015, 10:09
@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.
  Mit Zitat antworten Zitat
idefix2

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

AW: RegEx-Formatierung

  Alt 11. Aug 2015, 10:53
In der Hilfe zu PCRE (Syntax specification) steht:

(?:...) non-capturing group

Code:
^(@#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*(.*)?$
sollte also funktionieren
  Mit Zitat antworten Zitat
idefix2

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

AW: RegEx-Formatierung

  Alt 11. Aug 2015, 11:05
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:
INT 2 AUG 1917 (Mamas Geburtstag) // hier soll nur alles innerhalb der Klammer geparst werden, wobei Klammern und Inhalt ebenfalls optional sind
Also was jetzt, willst du dass (ABT|EST|CAL|INT) gefunden wird oder nicht?

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

Geändert von idefix2 (11. Aug 2015 um 11:31 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 07:32 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-2025 by Thomas Breitkreuz