Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi pos von hinten (https://www.delphipraxis.net/105585-pos-von-hinten.html)

qb-tim 25. Dez 2007 12:28


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?

rollstuhlfahrer 25. Dez 2007 12:52

Re: pos von hinten
 
geht doch ganz leicht:
Man nimmt die Länge und zieht davon die Position von vorne ab.

Delphi-Quellcode:
str := 'aabbccddee';
Poshi := Length(str) - Pos('b', str);
rollstuhlfahrer

PS: Code nicht getestet, evt. +/- 1 noch hinzufügen

qb-tim 25. Dez 2007 13:00

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

ErazerZ 25. Dez 2007 13:02

Re: pos von hinten
 
Delphi-Quellcode:
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;
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.

alzaimar 25. Dez 2007 13:25

Re: pos von hinten
 
Hier hat Amateurprofi eine wirklich verdammt schnelle Version geschrieben, die auch Rückwärts suchen kann.

Such mal hier und dann weiter unten nach dem Attachment 'Test_02.pas'.

Mondengel 3. Nov 2010 12:46

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:
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;
kurz und funktioniert :)
Bye :cheer:

DeddyH 3. Nov 2010 12:54

AW: pos von hinten
 
Wozu ist rStr da, wenn es nicht benutzt wird? Sagt Dein Compiler nichts dazu?

Namenloser 3. Nov 2010 12:56

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.

Luckie 3. Nov 2010 12:59

AW: pos von hinten
 
Und warum +2?

Mondengel 3. Nov 2010 13:01

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:
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;
Ist besser nicht 8-)

@NameLozer
Das hab ich nicht gewusst sorry :pale:
sollt nur ein weiterer Vorschlag sein


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 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