Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PosEx (https://www.delphipraxis.net/152975-posex.html)

youuu 15. Jul 2010 10:52

PosEx
 
Hi,

ich hab eine Frage zu PosEx und zwar wie kann ich direkt an das letzte ";" springen?

Beispiel
Delphi-Quellcode:
s := 'Hallo; Guten Tag; Guten Morgen; Guten Abend;';
Pos1 := Pos(';', s);
if Pos1 <> 0 then // erstes Semikolon gefunden
begin
  // Position des zweiten Semikolons ermitteln;
  // dazu fangen wir gleich nach dem ersten Semikolon an zu suchen:
  Pos2 := PosEx(';', s, Pos1 + 1);
  if Pos2 <> 0 then
    ShowMessage('gefunden an Position: ' + IntToStr(Pos2))
  else
    ShowMessage('nur ein Semikolon im String vorhanden');
  end
  else
  begin
    ShowMessage('kein Semikolon im String vorhanden');
  end;
Gut nun könnte ich Pos für Pos alles durch gehen, aber wenn ich gar nicht weiß wieviel ";" im Text sind, wie kann ich dann zum letzten oder z.B vorletzen ";" springen?

mkinzler 15. Jul 2010 10:59

AW: PosEx
 
Indem du rekursiv durchsuchst ( letztes Vorkommen). Das Vorletzte bekommst du nur durch Speichern der Zustände oder durch einen 2. Lauf

youuu 15. Jul 2010 11:06

AW: PosEx
 
Durch speichern der Zustände, wie meinst du das?

Klaus01 15. Jul 2010 11:10

AW: PosEx
 
.. oder den String manuel von hinten nach dem ';' durchsuchst.

Grüße
Klaus

DeddyH 15. Jul 2010 11:11

AW: PosEx
 
Das heißt, dass Du Dir merken sollst, wo das vorletzte Vorkommen war. Da Du nicht weißt, wann Du beim letzten bist, musst Du halt zwischenspeichern. Aber IMHO wäre Dein Vorhaben mit einer Schleife einfacher zu handhaben, die den String von hinten nach von durchgeht und zeichenweise vergleicht.

[edit] Wo war der rote Kasten? [/edit]

youuu 15. Jul 2010 12:18

AW: PosEx
 
Delphi-Quellcode:
Pos1 := 1;
while Pos1 <> 0 do
    Begin
      Pos1 := PosEx('<td align="center">', SubStr, Pos1 + 1);
      if Pos1 <> 0 then // erstes Semikolon gefunden
        Count:= Count + 1
    End;
So oder hab ich da einen Denkfehler drin?

DeddyH 15. Jul 2010 12:27

AW: PosEx
 
So solltest Du eine Endlosschleife erhalten, da Du immer wieder von Pos1 ausgehst, diese aber nie verändert wird. Was gefällt Dir denn an der vorgeschlagenen "Rückwärtsschleife" nicht?

freak4fun 15. Jul 2010 12:28

AW: PosEx
 
Nur für den Fall das du an die Einträge willst und das PosEx nur eine Idee ist. Es geht auch mit einer Stringlist und als Delimitter das ";", StrictDelimitter auf true. :cyclops:

Forlan 15. Jul 2010 12:45

AW: PosEx
 
Delphi-Quellcode:
for i := length(myString) downto 1 do
begin
  if myString[i] = ';' then
    ShowMessage('Das letzte ; befindet sich an der Stelle ' + IntToStr(length(myString)-i));
end;
Mögliche Fehler sind nicht ausgeschlossen, habe das letzte mal Delphi (intensiv) vor etwa 1 Jahr beutzt:stupid:

himitsu 15. Jul 2010 12:48

AW: PosEx
 
Zitat:

Zitat von DeddyH (Beitrag 1035469)
So solltest Du eine Endlosschleife erhalten, da Du immer wieder von Pos1 ausgehst, diese aber nie verändert wird.

Nee, wäre keine Endlosschleife, aber wenn mal ein ; an erster Stelle steht, dann wird dieses nicht entdeckt, da erst ab Position 2 begonnen wird. (1+1 = 2)

Delphi-Quellcode:
Pos1 := 0;
repeat
  Pos1 := PosEx('<td align="center">', SubStr, Pos1 + 1);
  if Pos1 <> 0 then Count:= Count + 1
until Pos1 = 0;
bzw.
Delphi-Quellcode:
Pos1 := 0;
repeat
  Pos1 := PosEx('<td align="center">', SubStr, Pos1 + 1);
  if Pos1 = 0 then break;
  Count:= Count + 1
until false;
// oder
Pos1 := 0;
while true do begin
  Pos1 := PosEx('<td align="center">', SubStr, Pos1 + 1);
  if Pos1 = 0 then break;
  Count:= Count + 1
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 Uhr.
Seite 1 von 2  1 2      

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