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;