String ab vorgegebener Position durchsuchen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
lilebor
Beiträge: 15
Registriert: So 1. Okt 2006, 10:03

String ab vorgegebener Position durchsuchen

Beitrag von lilebor »

Hallo

ich sehe gerade sicher den Wald vor Bäumem nicht!
aber wie kann ich einen String ab einer Position durchsuchen
bsp mein String enthällt mehrfach ein suchwort wobei ich aber nicht die
Position des ersten sondern die des zweiten (dritten vierten usw)
suche ?

Code: Alles auswählen

 
var_suchwert := 50;
position1 := pos (suche, infotext) + var_suchwert;
 
ergibt treffer eins + 50
also auch nicht das was ich will

kann mir da mal jemand einen Tip geben

Danke schonmal

Dets
Beiträge: 61
Registriert: Di 11. Sep 2007, 16:59
OS, Lazarus, FPC: Ubuntu Maverick (L 0.9.28.2-10, FPC 2.4.0)
CPU-Target: 32Bit
Wohnort: Lage
Kontaktdaten:

Re: String ab vorgegebener Position durchsuchen

Beitrag von Dets »

lilebor hat geschrieben: kann mir da mal jemand einen Tip geben
Kopiere dir deinen String, den du durchsuchen möchtest, ab var_suchwert bis zum Ende in einen temporären String und durchsuche den und addiere var_suchwert zum Ergebnis.

greetz, Dets ...

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: String ab vorgegebener Position durchsuchen

Beitrag von monta »

zu aufwendig..

Es gibt doch auch diverse Abarten von Pos.
einfach npos und posex bei solchen Sachen verwenden.
http://lazarus-ccr.sourceforge.net/docs ... /npos.html" onclick="window.open(this.href);return false;
http://lazarus-ccr.sourceforge.net/docs ... posex.html" onclick="window.open(this.href);return false;
Johannes

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: String ab vorgegebener Position durchsuchen

Beitrag von mschnell »

Auch wenn ich jetzt wieder Prügel bekomme :) :

Funktionen wie "pos" müssen mit großer Vorsicht verwendet werden, wenn die Unicode-Version von Lazarus eingesetzt wird. Entweder erstmal verstehen wie UTF8 funktioniert oder Widestring verwenden (was aber sehr leicht zu anderen Schwierigkeiten führt.)

Damit dieser Thread nicht auch wieder 10 Seiten Lang wird, bitte nicht rückfragen, sondern die Threads lesen, die bei der Suche nach "UTF8" auftauchen. Viel Spaß :evil:

-Michael

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: String ab vorgegebener Position durchsuchen

Beitrag von theo »

@mschnell: Fear, Uncertainty and Doubt ;-)

Gerade bei pos() oder posex() kommt es doch eigentlich gar nicht drauf an.
Es kann natürlich nicht schaden, sich mit UTF-8 auszukennen, aber in diesem Fall würde lilebor wahrscheinlich gar nichts davon merken.

lilebor
Beiträge: 15
Registriert: So 1. Okt 2006, 10:03

Re: String ab vorgegebener Position durchsuchen

Beitrag von lilebor »

Hallo,

vielen Dank nochmal für die schnelle Hilfe
Nun ist das Problem gelöst und Prg läuft. :mrgreen:

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: String ab vorgegebener Position durchsuchen

Beitrag von mschnell »

theo hat geschrieben:Gerade bei pos() oder posex() kommt es doch eigentlich gar nicht drauf an.
n := pos('B', 'ÄB'); ==> n=3 ==> ????? :)

-Michael

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: String ab vorgegebener Position durchsuchen

Beitrag von theo »

mschnell hat geschrieben:
theo hat geschrieben:Gerade bei pos() oder posex() kommt es doch eigentlich gar nicht drauf an.
n := pos('B', 'ÄB'); ==> n=3 ==> ????? :)

-Michael
Na und? Mach ein Real-Life Beispiel. Wenn lilebor zählen will, wie oft ein String vorkommt -> kein Problem.
Wenn er den String ersetzen will (obwohl es dafür bessere Prozeduren gäbe) -> kein Problem.
Du bringst immer ziemlich künstliche Beispiele. Wer will schon wirklich wissen, bei welchem Byte ein Zeichen steht? (ausser du? ;-)
Das ist doch auch nur eine Konvention.

Wie du vllt. weisst, versuche ich seit Jahr und Tag einen Rich-Editor zu schreiben. (Wird wahrsch. auch noch Jahre und Tage dauern ;-)
Ich habe den auch anfänglich mit intern WideString gebastelt. Das ist ja auch kein Problem, man muss nur bei TextOut und KeyPress umwandeln.
Kürzlich habe ich den ganzen Krempel in ein paar Stunden auf intern UTF-8 umgeschrieben (Um Speicher und Umwandlungen zu sparen)
Eigentlich waren das nur ein paar wenige Funktionen.

Das einzige was ich neu erfinden musste war diese Funktion:

Code: Alles auswählen

function UTF8CharLenAtBytePos(p: PChar; BytePos: integer): byte;
var i: integer;
begin
  inc(p, BytePos);
  Result := UTF8CharacterStrictLength(p);
  if Result > 0 then exit;
  if BytePos > 5 then i := 5 else i := BytePos;
  while i > 0 do
  begin
    dec(p);
    Result := UTF8CharacterStrictLength(p);
    if Result > 0 then exit;
    dec(i);
  end;
  Result := 0;
end;
..um bei einem Cursor-Left die Anfangsposition des UTF-8 Buchstabens zu finden.

Wie du dir vielleicht vorstellen kannst, ist ein Rich-Text Editor so ziemlich die maximale Anforderung an dieses Thema.
Muss man doch immerhin z.B. die Cursor Position mit dem zugrundeliegenden UTF-8 Text synchronisieren.
Aber irgendwie ist das alles halb so wild. Zwei drei Funktionen und das klappt.
Geschwindigkeit ist overall eher besser.

Antworten