string - separar - reemplazar caracteres en python
Encuentra la Ășltima ocurrencia de char en una cadena (5)
La mejor solución multiplataforma es TStringHelper.LastIndexOf , existe desde Delphi XE4.
Tenga en cuenta que esta función está basada en 0.
¿Existe alguna función RTL Delphi para determinar la posición de la última aparición de un carácter en una cadena?
RRUZ respondió la pregunta real (le dio una función de RTL).
Aún así, no me puedo resistir a dar un simple fragmento de código que hace lo que quiere:
function LastCharPos(const S: string; const Chr: char): integer;
var
i: Integer;
begin
result := 0;
for i := length(S) downto 1 do
if S[i] = Chr then
Exit(i);
end;
Dado que esto hace exactamente lo que usted desea y no ofrece otras características, es mucho más compacto (especialmente cuando usamos la sintaxis de Exit(Result)
de Delphi 2009 y posterior) y probablemente un poco más rápido. En Delphi 2007, sin embargo, tienes que hacer
function LastCharPos(const S: string; const Chr: char): integer;
var
i: Integer;
begin
result := 0;
for i := length(S) downto 1 do
if S[i] = Chr then
begin
result := i;
break; // or Exit; if you prefer that
end;
end;
Use StrRScan
o AnsiStrRScan
, ambos en la unidad SysUtils . Este último, a pesar de su nombre, funciona en caracteres Unicode en las versiones de Delphi donde string
es UnicodeString
. (Si aún necesita la versión Ansi "real", use la unidad AnsiStrings ).
Estas funciones buscan exactamente un carácter, mientras que LastDelimiter
busca cualquiera de varios caracteres de la lista de posibilidades dada: piense en StrRScan
como LastDelimiter
optimizado para un argumento de Delimiters
un carácter.
Y aquí está mi contribución para encontrar la posición de la enésima aparición de una subcadena dentro de una cadena.
function GetPositionOfNthOccurence(sSubStr, sStr: string; iNth: integer): integer;
var
sTempStr: string;
iIteration: integer;
iTempPos: integer;
iTempResult: integer;
begin
result := 0;
// validate input parameters
if ((iNth < 1) or (sSubStr = '''') or (sStr = '''')) then exit;
// evaluate
iIteration := 0;
iTempResult := 0;
sTempStr := sStr;
while (iIteration < iNth) do
begin
iTempPos := Pos(sSubStr, sTempStr);
if (iTempPos = 0) then exit;
iTempResult := iTempResult + iTempPos;
sTempStr := Copy(sStr, iTempResult + 1, Length(sStr) - iTempResult);
inc(iIteration);
end;
result := iTempResult;
end;
prueba la función LastDelimiter
, que es parte de la unidad SysUtils.