Thema: Delphi pos von hinten

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#17

AW: pos von hinten

  Alt 1. Jan 2011, 22:02
Zitat:
Und warum +2?
Weil ich's grade nochmal sehe.

Die Strings sind ja 1-basierens (wie schon erwähnt)
Diese 2 sind nun zwei Mal die 1 (1+1=2, wenn man was wegkürzt) oder eher 4 Mal die 1 (1+1+1-1=2).

entweder
+1: einmal vom Pos, für die Umrechnung
+1: und das Length(SubString), um dort auf das letzte Zeichen umzurechen
Delphi-Quellcode:
Result := Length(S) - Length(SubStr) - Result + 2;
Result := Length(S) - (Length(SubStr) - 1) - (Result - 1);
also um den Index von a auf b zu verschieben
Code:
123456789
     678

987654321
 876
 a b
a = Ergebnis von Pos(...)
b = letztes Zeichen, welches nach dem Umdrehen dann das Erste ist.


oder
+1: Length(S) um den Startindex auf das letzte Zeichen zu verschieben (0-basierend)
+1: Pos(SubStr, S) auf 0-basierend umrechnen
+1: Length(SubStr) ebenfalls auf das letzte Zeichen umrechnen
-1: das Ergebnis auf 1-basierend umrechnen



so, und nun nochmal alles zusammen:

alle Delphi-Versionen (ab Delphi 2009 kein direktes ANSI verfügbar)
Delphi-Quellcode:
uses StrUtils;

function ReversePos(SubStr, S: String): Integer;
begin
  SubStr := AnsiReverseString(SubStr);
  S := AnsiReverseString(S);
  Result := Pos(SubStr, S);
  if 0 <> Result then Result := Length(S) - Length(SubStr) - Result + 2;
end;

function ReversePosEx(SubStr, S: String; Offset: Integer = 1): Integer;
begin
  SubStr := ReverseString(SubStr);
  S := ReverseString(S);
  Offset := Length(S) - Offset + 1;
  Result := PosEx(SubStr, S, Offset);
  if 0 <> Result then Result := Length(S) - Length(SubStr) - Result + 2;
end;
ab Delphi 2009
Delphi-Quellcode:
uses StrUtils, AnsiStrings;

function ReversePos(SubStr, S: String): Integer; overload;
function ReversePos(SubStr, S: AnsiString): Integer; overload;
function ReversePosEx(SubStr, S: String; Offset: Integer = 1): Integer; overload;
function ReversePosEx(SubStr, S: AnsiString; Offset: Integer = 1): Integer; overload;

implementation

function ReversePos(SubStr, S: String): Integer;
begin
  SubStr := ReverseString(SubStr);
  S := ReverseString(S);
  Result := Pos(SubStr, S);
  if 0 <> Result then Result := Length(S) - Length(SubStr) - Result + 2;
end;

function ReversePos(SubStr, S: AnsiString): Integer;
begin
  SubStr := AnsiReverseString(SubStr);
  S := AnsiReverseString(S);
  Result := Pos(SubStr, S);
  if 0 <> Result then Result := Length(S) - Length(SubStr) - Result + 2;
end;

function ReversePosEx(SubStr, S: String; Offset: Integer = 1): Integer;
begin
  SubStr := ReverseString(SubStr);
  S := ReverseString(S);
  Offset := Length(S) - Offset + 1;
  Result := PosEx(SubStr, S, Offset);
  if 0 <> Result then Result := Length(S) - Length(SubStr) - Result + 2;
end;

function ReversePosEx(SubStr, S: AnsiString; Offset: Integer = 1): Integer;
begin
  SubStr := AnsiReverseString(SubStr);
  S := AnsiReverseString(S);
  Offset := Length(S) - Offset + 1;
  Result := PosEx(SubStr, S, Offset);
  if 0 <> Result then Result := Length(S) - Length(SubStr) - Result + 2;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat