Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Platzhalter in einem String übertragen (https://www.delphipraxis.net/112850-platzhalter-einem-string-uebertragen.html)

gibb 28. Apr 2008 12:07


Platzhalter in einem String übertragen
 
Hallo zusammen

Ich steh gerade vor einem (zumindest für mich) kniffligen problem.

Und zwar habe ich eine Log-Datei die ich durchforsten möchte diese hat ganz verschiedene einträge. Jedoch will ich überprüffen ob dieser eintrag gültig ist oder nicht. Resp, ob er erwartet ist oder nicht.

Der string enthält in der regel 2 informationen die wichtig sind. Der ganze string wird konfiguriert und mit Platzhalter versehen welche die 2 informationen darstellen. (kann da ganz verschiedenes stehen) ich will anschliessend anhand von Platzhalter 1 und der Konfiguration überprüffen ob Platzhalter 2 gültig ist...

also der string könnte so aussehen:

|platzhalter1| text text text text|Platzhalter2| text text

wo sich jedoch die Platzhalter befinden ist offen.

mein ziel ist es nun wie mit einer Maske über die Log-Datei zu fahren und immer die Platzhalter aufzufüllen und zu überprüffen. Jedoch wie mache ich das möglichst performant. Den String auseinanderschneiden und mit Pos zu prüffen ob er vorkommt kann ich selber... aber ich möchte dies halt möglichst performant lösen. So etwas wie ein Stringreplace halt einfach umgekehrt. Ich will die Strings die an dieser Position stehen wenn der rest des Textes übereinstimmt.

gibt es hierfür eine gescheite und möglichst performante lösung ?

Freundliche grüsse

Gibb

mkinzler 28. Apr 2008 12:16

Re: Platzhalter in einem String übertragen
 
Sollte über reguläre ausrücke lösbar sein.

gibb 28. Apr 2008 12:18

Re: Platzhalter in einem String übertragen
 
joa hab ich auch schon gehört das wollte ich sowieso noch googeln konnte mich aber nicht mehr an den Namen errinern. Soweit einmal danke.. :-D

wer ein gutes tutorial oder ne unit für delphi kennt darf mir gerne nen link servieren.

mkinzler 28. Apr 2008 12:24

Re: Platzhalter in einem String übertragen
 
Daniel hat am letzten Delp-Stammtisch einen Votreag über dieses thema gehalten:
http://www.delphipraxis.net/internal...t.php?p=812520

gibb 28. Apr 2008 12:29

Re: Platzhalter in einem String übertragen
 
Joa das wäre sicherlich gut gewesen... leider finde ich auf dieser seite nirgends ein summary oder eine zusammenfassung. Entweder ich bin blind oder blöd oder es ist nicht da. ^^'

Wenns wirklich net da ist hilft mir der Link leider nicht weiter...

mkinzler 28. Apr 2008 12:37

Re: Platzhalter in einem String übertragen
 
http://www.delphipraxis.net/video#Stammtisch_2

gibb 28. Apr 2008 13:15

Re: Platzhalter in einem String übertragen
 
das ist wirklich toll muss sagen find ich super diese videos... das hat mir echt geholfen... ich versuch mich jetzt hier einmal an meinem regulären ausdruck und ich hoff ich bekomm rückmeldung ob das möglich ist oder nicht... ^^'


der string den ich durchsuchen muss istdieserhier.

der string den ich |Platzhalter1| muss ist|Platzhalter2|hier. <- so erhalt ich den string.

der string den ich (.+) muss ist(.+)hier. <- wäre mein regulärer ausdruck den ich daraus machen muss umd die wörter durchsucehn und dieser zu erhalten richtig ? oder isses nun so das das + einfach wirklich ALLES nimmt was später kommt ? wenn ja wie unterbinde ich das ?

gibb 28. Apr 2008 15:26

Re: Platzhalter in einem String übertragen
 
Delphi-Quellcode:
   if RE_NewState.Exec(LogToAnalyzeList[i]) then
     begin
       NewState := RE_NewState.Match[0];
     end;
Ich hab jetzt das mit dem Oben genannten String... leider scheint das nie zu matchen... könnte es daran liegen zum beispiel der Anfang des Strings nicht in der Expression vorkommt ?
Also unbekannt unbekannt der string den ich durchsuchen muss istdieserhier.

und ich nur diesen teil erhalte:
der string den ich |Platzhalter1| muss ist|Platzhalter2|hier. <- so erhalt ich den string.

und ich anschliessend halt folgende expression gemacht hab:
der string den ich (.+) muss ist(.+)hier.

also kann es sein das er mühe mit der Unbekannten hat ? wie müsste ich meine expression gestalten das das ganze auch funzt ?

gibb 29. Apr 2008 06:50

Re: Platzhalter in einem String übertragen
 
also ich habe mich der unbekanten entledigt... daran sollte es also nicht liegen :-/
kann mir jemand einen tipp geben woran das liegen könnt das

Delphi-Quellcode:
 if RE_NewState.Exec(Zeileasd) then//(LogToAnalyzeList[i]) then
     begin
       NewState := RE_NewState.Match[0];
       inc(MatchNewCounter);
     end;
niemals in die Bedingung reingeht ? muss doch definitiv an meiner regular expression liegen oder ?

Delphi-Quellcode:
  ExpressionNew := Stringreplace(FStateMachinePatern,'%%NewState%%','(.+)',rfIgnoreCase);
  ExpressionOld := Stringreplace(FStateMachinePatern,'%%OldState%%','(.+)',rfIgnoreCase);
  RE_NewState.Expression := ExpressionNew;
  RE_OldState.Expression := ExpressionOld;
aber ich hab cerstanden das das der punkt ein platzhalter für ein x beliebiges Zeichen ist und das + eine x beliebige anzahl von einem platzhalter für ein x beliebiges Zeichen.... liegt es daran ?

gibb 29. Apr 2008 08:47

Re: Platzhalter in einem String übertragen
 
habs gefunden... war nen logik fehler meinerseits ^^'

das ganze kann nicht matchen weil Old oder New State als platzhalter immernoch in der Expression drinne ist.

Lösung: beide ersetzten und zuerst prüffen welcher platzhalter als erstes definiert ist und anschliessend die matches in der richtigen reienfolge auslesen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 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