AGB  ·  Datenschutz  ·  Impressum  







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

Delphi TRegExpr

Ein Thema von Jim Carrey · begonnen am 22. Okt 2016 · letzter Beitrag vom 22. Okt 2016
Antwort Antwort
Seite 1 von 2  1 2      
Jim Carrey
(Gast)

n/a Beiträge
 
#1

Delphi TRegExpr

  Alt 22. Okt 2016, 14:04
Ich tue mich gerade ein bisschen schwer mit diesem Neuland namens RegExpr.

Ich benutze eine simple String-Funktion, um die Vorkommen eines Strings TeilString in einem String S zu zählen.
Ich möchte das gerne auf RegEx umstellen, sodass ich auch Wildcards im TeilString benutzen darf.

Nur wie?

Delphi-Quellcode:
RegExpr := TRegExpr.Create;
try
 RegExpr.ModifierG := False;
 RegExpr.Expression := '<!-- DIESEN * MÖCHTE ICH FINDEN -->'; // * könnte alles sein, daher ist Pos() keine Lösung
 // un nu?
finally
 RegExpr.Free;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#2

AW: Delphi TRegExpr

  Alt 22. Okt 2016, 14:14
Ähhhhh, nimm einen HTML-Parser und schon ist alles Richtig.

Und ich glaube du hast RegEx noch nicht ganz verstanden.
"*" ist kein Platzhalter, wie z.B. ? und * bei der Dateisuche.
Das ist ein Multiolikator, der auf das Zeichen davor angewendet wird, also suchst du nach 0 oder mehreren Leerzeichen.

Zitat:
// un nu?
Man mag es nicht glauben, aber das wird in jedem TRegExpr-Turorial gezeigt und davon kennen die SuFu und Google massenaft.
Sogar die OH zeigt wie es geht, bzw. sie verlinkt auf die entsprechende Demo.


Und doch, auch Pos/PosEx wäre eine Lösung, denn man kann ja das davor und das danach suchen und dann das dazwischen rauskopieren.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (22. Okt 2016 um 14:17 Uhr)
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#3

AW: Delphi TRegExpr

  Alt 22. Okt 2016, 14:16
Ginge das hier auch oder ist das Quatsch?
TRegEx.Matches(sMeinString, '<!-- DIESEN (.*) MÖCHTE ICH FINDEN -->').Count
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#4

AW: Delphi TRegExpr

  Alt 22. Okt 2016, 14:29
Ginge das hier auch oder ist das Quatsch?
Mal sehn was Delphi-Referenz durchsuchenTMatchCollection.Count sagt ... joar?

ABER, denk dir eine ( ) um Alles drumrum und wenn es was trifft, dann hast du somit je ZWEI Matches pro Match, da 2 (...) ,
aber im Notfall einfach ausprobieren.
docwiki.embarcadero.com/RADStudio/Seattle/en/Regular_Expressions
docwiki.embarcadero.com/CodeExamples/Seattle/en/RTL.RegExpressionVCL_Sample
docwiki.embarcadero.com/Libraries/Seattle/en/System.RegularExpressions.TRegEx.Matches <- "Returns all the matches present in the input string"
docwiki.embarcadero.com/Libraries/Seattle/en/System.RegularExpressions.TMatchCollection
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (22. Okt 2016 um 14:44 Uhr)
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#5

AW: Delphi TRegExpr

  Alt 22. Okt 2016, 14:30
Danke für die Literatur. Somit verwende ich jetzt Matches statt Match, da ich das besser in meiner Schleife gebrauchen kann.
Jetzt muss ich nur noch finden, wie man die einzelnen Funde ausließt.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#6

AW: Delphi TRegExpr

  Alt 22. Okt 2016, 16:26
Ok ich habe jetzt alles hinbekommen.
Nur ist RegEx hier ein bisschen... sehr lahmarschig wie ich finde. Bei einer 5 MB großen Datei dauern 2 TRegEx.Matches-Ausführungen mit jeweils 2x (.*) (also 4 insgesamt) im Pattern insgesamt 24 Sekunden - vorher mit einer sehr umständlichen pos/posex-Konstruktion 5 Sekunden.

Geändert von Jim Carrey (22. Okt 2016 um 16:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

AW: Delphi TRegExpr

  Alt 22. Okt 2016, 16:39
Es hilft, wenn der Regex nicht greedy ist. Denn so wird erstmal der komplette Dateiinhalt für das erste .* gematcht, dann merkt die Engine, dass das nicht passt und probiert es ein Zeichen früher aus. Es hilft dann auch schon viel, wenn du nicht "." nimmst, sondern nur bestimmte Zeichen zulässt.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#8

AW: Delphi TRegExpr

  Alt 22. Okt 2016, 16:40
Dieses Wort höre ich zum ersten mal. Wo stelle ich das denn ein ob es greedy ist oder nicht?
Warte ich bin dumm ich habs. Es dauert aber genau solange.

(.*?) statt (.*) meinst du doch?

Geändert von Jim Carrey (22. Okt 2016 um 16:43 Uhr)
  Mit Zitat antworten Zitat
SProske

Registriert seit: 16. Feb 2015
Ort: Halle/S.
116 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: Delphi TRegExpr

  Alt 22. Okt 2016, 17:40
Egal ob .* oder .*?, wenn es dir um Performance geht, sollte man beide eigentlich vermeiden. Du wirst aber selbst mit einem hoch-optimierten Regex kaum eine Chance gegen Pos/Posex-Suche haben.

Solltest du also tatsächlich nach
Code:
<!-- DIESEN (.*) MÖCHTE ICH FINDEN -->
suchen, ginge evt. noch so etwas wie:
Code:
<!-- DIESEN ((?>[^ \n\r]+| (?!MÖCHTE ICH FINDEN -->))*) MÖCHTE ICH FINDEN -->
Solltest du hingegen nach
Code:
<!--(.*)-->
suchen (was mir sinnvoller erschiene), ginge dann
Code:
<!--((?>[^-\r\n]+|-(?!->))*)-->
Sebastian
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#10

AW: Delphi TRegExpr

  Alt 22. Okt 2016, 18:23
Ich hätte noch eine weitere Idee.
Genau genommen geht es hier um Log-Dateien und deren Einträge, welche ich pro-Datum anzeigen lassen möchte.
Also iteriere ich durch die Log-Datei und gucke, ob dieser Eintrag-N zu Datum X passt.
Dafür suche ich mir per RegEx aktuell eben nur die erste und letzte Zeile jedes Log-Eintrags raus.
Die beginnen eben mit <!-- loganfang datum --> und endet mit <!-- logende datum -->
Dann kopiere ich von loganfang bis logende und so bekomme ich alle Logeinträge für Datum X.

Das Zusammenschnippseln geht schnell (< 60ms). Aber das RegEx dauert bei 5 MB und einer Testdatei mit, ich glaube es waren rund 9000 Zeilen mit loganfang und logende eben rund 25 Sekunden.

Jetzt zu meiner Idee.
ich speichere einfach 1 Logdatei pro Tag. Dann brauche ich nur die Datei einzulesen und bin von diesem RegEx komplett weg.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:48 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