Autor |
Beitrag |
rstaeker
      
Beiträge: 94
WIN 2000
D6 Prof
|
Verfasst: Mi 15.12.04 22:39
Hallo,
ich möchte gerne das letzte Vorkommen eines Teilstrings in einem String finden. Ich brauche praktisch den Index des letzten Vorkommens des Teilstrings.
Mein bisheriger Code (  erzeugt eine Endlosschleife)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| function TText.ScanSource(const Source:String):boolean; var Text, TempText:String; Position: integer; First,Last:integer; MaxLength: integer; Endfound:boolean; begin Text:= Source; TempText:= Source; MaxLength:=Length(Text); Position:=0; Last:=0; EndFound:=False;
First:=pos('&start',TempText); While ((Last<=MaxLength) or not EndFound) do begin TempText:=Copy(TempText,First, MaxLength); Position:=pos('&ende',TempText); if Position<>0 then begin Last:=Position; TempText:=Copy(TempText,First, MaxLength-Last-First); end else EndFound:=True; end;
end; |
Ich habe wahrscheinlich irgendwo einen Denkfehler drin, findet den Jemand?
Vielen Dank schonmal
Rene
|
|
patrick
      
Beiträge: 1481
WIN2k, WIN XP
D6 Personal, D2005 PE
|
Verfasst: Do 16.12.04 00:09
ich habs nur überfolge aber:
wie wäre es denn wenn du das OR durch ein AND ersetzt? 
_________________ Patrick
im zweifelsfall immer das richtige tun!!!
|
|
rstaeker 
      
Beiträge: 94
WIN 2000
D6 Prof
|
Verfasst: Do 16.12.04 00:14
Sch****
Vielen Dank Patrick!!
daß war es vielen Dank
Rene
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Do 17.04.08 09:16
Gibt's denn da keine eingebaute Funktion?
Hab' die Methode LastDelimiter gefunden, aber die sagt mir ja nur die letzte Position eines der übergebenen Zeichen, bei einem Teilstring hilft das also leider gar nichts.
Bei .NET und Java gibt's für Strings die Methode lastIndexOf() - gibt's da für Delphi nichts vergleichbares? Muss man sich sowas wirklich selber schreiben?
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 17.04.08 09:47
Hallo,
du kannst ja PosEx aus strutils nutzen oder _PosEx www.delphipraxis.net...&highlight=posex oder fastcode.sourceforge...stcodeproject/41.htm kopieren.
Dann rufst PosEx solange auf bis es 0 wird, und davor war wohl das letzte Vorkommen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| hellfreezes := false; lastoccurence:= 0; AbPos := 1; repeat AbPos := PosEx(Was,Worin,AbPos); If AbPos = 0 then break; lastoccurence := AbPos until hellfreezes; ..gefunden oder nicht gefunden |
Gruß Horst
P.S.
temp war mal Abpos....
Zuletzt bearbeitet von Horst_H am Do 17.04.08 10:08, insgesamt 1-mal bearbeitet
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Do 17.04.08 09:54
Danke, wie's grundlegend funktioniert weiß ich ja. Gibt da hunderte Methoden - man könnte auch Original und Suchstring umdrehen und dann mit Pos arbeiten, die Länge des Strings dann minus das Ergebnis von Pos rechnen.
Oder einfach von hinten anfangen minus Anzahl Zeichen des Suchstrings und dann weiter nach vorne wandern, oder, oder, oder.
Aber 'ne built-in Variante gibt's wirklich nicht?
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 17.04.08 09:57
Eine eingebaute Variante gibts afaik nicht. Aber ne Scgleife mit break, die läuft, bis die Hölle zufriert, ist wohl etwas ungut  . Ich habs mal so gemacht
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| idx := pos(p,t); moreidx := idx; while (moreidx > 0) and (moreidx < length(t)) do begin idx := moreidx; moreidx := posEx(p,t,moreidx+1); end; |
_________________ We are, we were and will not be.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 19.04.08 12:48
Doch, es gibt auch eine eingebaute Funktion die das kann, und die ist garantiert auch schneller als deine Version, denn wenn mich nicht alles täuscht verwendet sie das Boyer-Moore Verfahren.
Es ist die Funktion SearchBuf aus der Unit StrUtils.
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
baka0815
      
Beiträge: 489
Erhaltene Danke: 14
Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
|
Verfasst: Mi 07.05.08 17:30
Motzi hat folgendes geschrieben: | Doch, es gibt auch eine eingebaute Funktion die das kann, und die ist garantiert auch schneller als deine Version, denn wenn mich nicht alles täuscht verwendet sie das Boyer-Moore Verfahren.
Es ist die Funktion SearchBuf aus der Unit StrUtils. |
Ok, mit SearchBuf kann man einen Puffer vorwärts oder rückwärts durchsuchen, das ist ja schon mal etwas. Allerdings bekommt man ein PChar zurück, also einen Zeiger auf die Stelle, an der der Suchtext gefunden wurde.
Wie bekomme ich nun die Stelle selbst raus?
Ich suche "test" in "Dies ist ein Test und ein zweiter Test folgt", dann möchte ich als Ergebnis 35 haben.
Gibt's dafür was eingebautes, bzw. kann ich PChar so "umbiegen", dass ich die Position im String bekomme?
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 07.05.08 19:21
Delphi-Quelltext 1:
| Index = Integer (ResultPtr) - integer (PointerAufErstesZeichen) |
_________________ Na denn, dann. Bis dann, denn.
|
|
|