![]() |
AW: Problem mit Pos/PosEx
Vielleicht so besser?
Delphi-Quellcode:
Ergebnis ist wie aus Post #2
program Project13;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; const derText = '[[Hamburg]] || 2008 ||data-sort-value="Diplomica"| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch'; // |data-sort-value="" soll raus var sArr: TArray<string>; cArr: array[0..0] of Char; i: Integer; s: string; begin try cArr[0] := '|'; sArr := derText.Split(cArr); for i := Low(sArr) to High(sArr) do if Pos('data-sort-value', sArr[i], 1) = 0 then s := s + sArr[i] + '|'; s := Copy(s, 1, Length(s) - 1); WriteLn(s); ReadLn; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
AW: Problem mit Pos/PosEx
Hier mal ein PascalScript, dass mit den Daten von Wikipedia (wie mir scheint) funktioniert:
Delphi-Quellcode:
Editor ist 'ne Stringliste, in die ich den fraglichen Inhalt der Seite
program Test;
function DeleteSearchText(sText, sSearchTextA, sSearchTextB : String) : String; var iPos1 : Integer; iPos2 : Integer; iLenA : Integer; iLenB : Integer; begin iLenA := Length(sSearchTextA); iLenB := Length(sSearchTextB); while Pos(sSearchTextA,sText) > 0 do begin iPos1 := Pos(sSearchTextA,sText); iPos2 := PosEx(sSearchTextB,sText,iPos1 + iLenA); sText := Copy(sText,1,iPos1 - 1) + Copy(sText,iPos2 + 1,Length(sText)); end; Result := sText; end; var i : Integer; begin for i := 0 to Editor.Count - 1 do begin WriteLn(DeleteSearchText(Editor[i],'data-sort-value="','"')); end; end. ![]()
Code:
aus
|style="border-style:none; text-align:center;" data-sort-value="A!"| wird |style="border-style:none; text-align:center;" | aus | [[Acabus Verlag|ACABUS Verlag]] || [[Hamburg]] || 2008 ||data-sort-value="Diplomica"| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch wird | [[Acabus Verlag|ACABUS Verlag]] || [[Hamburg]] || 2008 ||| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch aus |data-sort-value="Krüger"| [[Bücher Krüger]] || Dortmund || 1833 ||data-sort-value="2009"| † 2009 || wird || [[Bücher Krüger]] || Dortmund || 1833 ||| † 2009 || |
AW: Problem mit Pos/PosEx
lol, heut haben wir es ja echt miteinander @Delphi.Narium
post #2 und #3 nur paar sekunden getrennt und nun schon wieder *lach* Gute Nacht :-) |
AW: Problem mit Pos/PosEx
Zitat:
mit Pos1+1 findet das zweite Pos/PosEx natürlich das " im ersten Suchstring, darum muß die zweite Suche auch hinter dem ersten Suchstring begonnen werden. Wenn der zweite Suchstring nicht im Ersten vorkäme, ware es egal. (man könnte die zweite Suche also an der selben Position beginnen, wie die Erste, auch wenn es sinnlos wäre, aber zumindestens paar Byte Code sparen täte) z.B. nach
Delphi-Quellcode:
suchen
'"|'
|
AW: Problem mit Pos/PosEx
Vielen Dank an euch alle!
Die Erklärungen sind (augenscheinlich) ja richtig. Weiterhin verstehe ich dennoch nicht, was der Fehler an meinem Gedankengang war:
Delphi-Quellcode:
In diesem Beispiel sollte doch Dummy_String die Zeichenkette data-sort-value="Diplomica"| beeinhalten.
var
stext: string; SearchTextA, SearchTextB: String; Dummy_String: String; Pos1, Pos2: Integer; begin stext := '|-' + '| [[A1 Verlag]] || München || 1990 ||2017, Tätigkeit eingestellt' + '| Belletristik, Sachbuch' + '|-' + '| [[Abenteuer Medien Verlag]] || Hamburg || 1993 || || Phantastik, Fantasyspiele' + '|-' + '| [[Acabus Verlag|ACABUS Verlag]] || [[Hamburg]] || 2008 ||data-sort-value="Diplomica"| [[Diplomica Verlag|Verlagsgruppe Diplomica]] || Belletristik, Sachbuch' + '|-' + '| [[Achterbahn (Verlag)|Achterbahn]] || [[Kiel]] || 1991 || 2003 Lappan Verlag, Oldenburg (nach Insolvenz) || Comics' + '|-'; SearchTextA := 'data-sort-value="'; SearchTextB := '"|'; Pos1 := Pos(SearchTextA, stext, 1); Pos2 := Pos(SearchTextB, stext, Pos1 + 1 + Length(SearchTextA)) + Length(SearchTextB); Dummy_String := Copy(stext, Pos1, Pos2); showmessage(Dummy_String); Aber probiert es selbst aus. Ich versuche den Fehler zu finden. Oder muss ich meine Logik anpassen? LG Mathias |
AW: Problem mit Pos/PosEx
Der zweite Fehler ist hier:
Delphi-Quellcode:
Dummy_String := Copy(stext, Pos1, Pos2);
Pos1 ist der Beginn von SearchTextA. Pos2 ist die Länge von SearchTextA zuzüglich der Länge von SearchTextB. Nun gehst Du her und kopierst genau diesen Teil aus sText. Damit erhälst Du dann SearchTextA + SearchTextB als einen String. Du möchtest aber alles vor SearchTextA und alles hinter SearchTextB. Von daher musst Du zuerst den Teilstring vor Pos1 und dann den Teiltring hinter Pos2 kopieren.
Delphi-Quellcode:
Dummy_String := Copy(stext, 1, Pos1 - 1) + Copy(stext, Pos2 + 1,Length(stext));
|
AW: Problem mit Pos/PosEx
Zitat:
Nur nochmal zur Rekapitulation (ich begreife es einfach nicht). Pos/PosEx suchen beide nach Vorkommen. Bei der ersten Suche wird korrekt aus einem Text das erste Vorkommen gefunden. Basis ist hier der Textbeginn. Bei der zweiten Suche möchte ein Vorkommen gefunden werden, aber erst nach der Position der ersten Suche. Suchbasis ist NICHT der Textbeginn, sondern die Position der ersten Suche.
Delphi-Quellcode:
Ich glaube, ich habe es nun doch endlich verstanden. Mein Fehler war immer, dass ich vom Basistext ausgegangen bin, also Pos1 und Pos2 immer vom Anfang des Textes verstanden haben wollte. Im Endeffekt ist es ja auch korrekt so. Die Positionen stimme ja überein, jedoch ist dann Copy nicht darauf aus, zweimal vom Anfang des Textes zu suchen, sondern nur einmal und im Anschluss nur die Anzahl der zu kopierenden Zeichen. Somit war es ein logischer Fehler meinerseits.
var
StringA: String; Pos1, Pos2: Integer; Dummy_String: String; begin StringA := 'ABCDEFGHJK'; Pos1 := Pos('DE', StringA, 1); // Pos1 ist korrekt VOR der 4. Stelle Pos2 := Pos('G', StringA, Pos1); // Pos2 ist wie gewünscht VOR der 7. Stelle Dummy_String := Copy(StringA, Pos1, Pos2); // enthält DEFGHJK; sollte aber eigentlich DEF beinhalten Pos2 := Pos('G', StringA, Pos1) - Pos1; // Pos2 ist wie gewünscht an Position 7 - 4 Dummy_String := Copy(StringA, Pos1, Pos2); // enthält endlich DEF showmessage(Dummy_String); end; Vielen lieben Dank! Nach 20 Jahren - es ist eigentlich zum Schämen - habe ich endlich verstanden, warum das nie klappen wollte, wenn ich diese und ähnliche String-Funktionen nutzen wollte. Liebe Grüße Mathias |
AW: Problem mit Pos/PosEx
ich glaube ich verstehe so langsam, es ging dir nicht um codes von delphinarium oder mir sondern dir zu erklären warum dein code kaputt ist/war.
( ![]() |
AW: Problem mit Pos/PosEx
Zitat:
Ja. :-D
Delphi-Quellcode:
Meinst Du das mit else?
if Pos('data-sort-value', sArr[i], 1) = 0 then
s := s + sArr[i] + '|' else variable := sArr[i]; |
AW: Problem mit Pos/PosEx
Zitat:
frag mich nicht was schneller ist, aber das ist generischer glaube ich |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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