AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit Pos/PosEx

Ein Thema von NoGAD · begonnen am 11. Apr 2021 · letzter Beitrag vom 12. Apr 2021
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 01:53
Vielleicht so besser?
Delphi-Quellcode:
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.
Ergebnis ist wie aus Post #2
Gruß vom KodeZwerg

Geändert von KodeZwerg (12. Apr 2021 um 01:55 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#12

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 01:54
Hier mal ein PascalScript, dass mit den Daten von Wikipedia (wie mir scheint) funktioniert:
Delphi-Quellcode:
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.
Editor ist 'ne Stringliste, in die ich den fraglichen Inhalt der Seite https://de.wikipedia.org/w/index.php...edit&section=1 per Copy&Paste eingefügt habe.
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 ||
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 01:58
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
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 09:35
Mir scheint, dass diese Zeile falsch ist.
    Pos2 := Pos(SearchTextB, stext, Pos1 + 1) + Length(SearchTextA);

Die Suche muss ab Pos1 + 1 + Length(SearchTextA) beginnen.
    Pos2 := Pos(SearchTextB, stext, Pos1 + 1 + Length(SearchTextA));

Die Längenermittlung vor den Beginn der zweiten Suche muss mit in den Funktionaufruf von Pos und nicht zum Ergebnis der zweiten Pos addiert werden.

Es ist letztlich ein Problem der Klammersetzung.
Um das genauer zu erklären,
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 '"|' suchen
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (12. Apr 2021 um 10:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
345 Beiträge
 
Delphi 10.4 Sydney
 
#15

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 11:12
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:
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);
In diesem Beispiel sollte doch Dummy_String die Zeichenkette data-sort-value="Diplomica"| beeinhalten.

Aber probiert es selbst aus.


Ich versuche den Fehler zu finden. Oder muss ich meine Logik anpassen?

LG Mathias
Mathias
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#16

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 11:33
Der zweite Fehler ist hier:
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.

Dummy_String := Copy(stext, 1, Pos1 - 1) + Copy(stext, Pos2 + 1,Length(stext));
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
345 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 12:22
Der zweite Fehler ist hier:
Dummy_String := Copy(stext, Pos1, Pos2); [..]
Nun gehst Du her und kopierst genau diesen Teil aus sText. Damit erhälst Du dann SearchTextA + SearchTextB als einen String.

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:
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;
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.

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
Mathias
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 12:30
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.
(hier hätte man nur einen "else" einbauen brauchen um den string zu erhalten hehehe)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von NoGAD
NoGAD

Registriert seit: 31. Jan 2006
Ort: Weimar
345 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 12:39
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.

Ja.


Delphi-Quellcode:
      if Pos('data-sort-value', sArr[i], 1) = 0 then
        s := s + sArr[i] + '|'
      else
        variable := sArr[i];
Meinst Du das mit else?
Mathias
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Problem mit Pos/PosEx

  Alt 12. Apr 2021, 12:47
Delphi-Quellcode:
      if Pos('data-sort-value', sArr[i], 1) = 0 then
        s := s + sArr[i] + '|'
      else
        variable := sArr[i];
Meinst Du das mit else?
auch Ja hahahaha
frag mich nicht was schneller ist, aber das ist generischer glaube ich
Gruß vom KodeZwerg
  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 11:28 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