![]() |
pos von hinten
Hi,
ich möchte einen Substring in einem String suchen, und zwar von HINTEN. d.h: PosHinten('a', 'abcabc') => 4 und nicht 1 Gibt es so eine Funktion? |
Re: pos von hinten
geht doch ganz leicht:
Man nimmt die Länge und zieht davon die Position von vorne ab.
Delphi-Quellcode:
rollstuhlfahrer
str := 'aabbccddee';
Poshi := Length(str) - Pos('b', str); PS: Code nicht getestet, evt. +/- 1 noch hinzufügen |
Re: pos von hinten
ich meine nicht die Position von hinten gezählt, sonder die Position des ersten SubStr von hinten:
Delphi-Quellcode:
s := 'hallo ich heiße albert'
PosHinten('a', s) // => 15 und nicht 2 |
Re: pos von hinten
Delphi-Quellcode:
Quickedit: sorry es müsste "for i := Length(s) +1 downto Index do" heißen und nicht "for i := Length(s) downto Index do". Jetzt funktioniert es wieder.
function MyPosEx(const SubStr, s: string; Index: Integer = 1; Upwards: Boolean = False): Integer;
var i, intSubStrLen: Integer; begin Result := 0; if (Index < 1) then Exit; if Upwards then begin intSubStrLen := Length(SubStr); if (Index >= Length(s)) then Exit; if (intSubStrLen < 1) then Exit; for i := Index to Length(s) do begin if (Copy(s, I, intSubStrLen) = SubStr) then begin Result := I; Exit; end; end; end else begin intSubStrLen := Length(SubStr); if (intSubStrLen < 1) then Exit; for i := Length(s) +1 downto Index do begin if (I - intSubStrLen < 1) then Exit; if (Copy(s, I - intSubStrLen, intSubStrLen) = SubStr) then begin Result := I - intSubStrLen; Exit; end; end; end; end; procedure TForm1.FormCreate(Sender: TObject); const s = 'abcdefghijklmnopqrstuvwxyz'; c = 'bc'; begin ShowMessage(Format('MyPosEx of c: %d' + #13#10 + 'MyPosEx of c (down): %d' + #13#10 + 'Pos of c: %d', [ MyPosEx(c, s, 1, True), MyPosEx(c, s), Pos(c, s)])); end; |
Re: pos von hinten
Hier hat Amateurprofi eine wirklich verdammt schnelle Version geschrieben, die auch Rückwärts suchen kann.
Such mal ![]() |
AW: pos von hinten
Ist mir klar das das wahrscheinlich nicht mehr gebraucht wird :roll:,
schreib aber für alle die das gleiche Problem haben ^^. Hab einen kleinen aber schnellen Quellcode
Delphi-Quellcode:
kurz und funktioniert :)
uses StrUtils
function PosR(Substr, s : String) : Integer; var rStr : string; begin rStr := reverseString(s); result := Pos( reverseString(SubStr), reverseString(s)); if( 0 <> result) then begin result := length(S)-result-Length(SubStr)+2; end; end; Bye :cheer: |
AW: pos von hinten
Wozu ist rStr da, wenn es nicht benutzt wird? Sagt Dein Compiler nichts dazu?
|
AW: pos von hinten
Klein ist er, ja, aber schnell mit Sicherheit nicht. Hier wird ja erstmal der komplette String umgedreht und dann noch die Suche durchgeführt. Noch schlimmer: Er wird nicht nur umgedreht, sondern es wird ein 2. String erzeugt, der die Umkehrung des Originals beinhaltet.
Solange es keine performancekritische Stelle ist, kannst du den Code natürlich verwenden, aber ansonsten würde ich lieber auf die optimierte Funktion zurückgreifen. |
AW: pos von hinten
Und warum +2?
|
AW: pos von hinten
OOOOOOOOOps :shock:
danke für den Hinweis DeddyH ich war wohl etwas zu schnell :lol: Nartürlich brauch man rStr nicht :stupid:
Delphi-Quellcode:
Ist besser nicht 8-)
uses StrUtils
function PosR(Substr, s : String) : Integer; begin result := Pos(reverseString(SubStr), reverseString(s)); if( 0 <> result) then result := length(S) - result - Length(SubStr) + 2; end; @NameLozer Das hab ich nicht gewusst sorry :pale: sollt nur ein weiterer Vorschlag sein |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 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