2011-04-30 14 views

Respuesta

24

prueba la función LastDelimiter que es parte de la unidad SysUtils.

+0

System.SysUtils.TStringHelper.LastIndexOf también podría ser útil cuando desee una cadena en lugar de un carácter. – Ampere

12

RRUZ respondió la pregunta real (le dio una función RTL).

Sin embargo, yo no puedo resistirse 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 quiere y no ofrecen otras características, es mucho más compacto (especialmente cuando utilice la sintaxis Exit(Result) de Delphi 2009 y posterior) y probablemente un poco más rápido. En Delphi 2007, sin embargo, usted tiene 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; 
+3

¿Por qué cada respuesta que doy downvoted al mismo tiempo? –

+1

+1 fuera de simpatía :) – Funk247

11

Uso StrRScan o AnsiStrRScan, tanto en los SysUtils unidad. 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 "real" ANSI, utilizar los AnsiStrings unidad.)

Buscar en estas funciones a un único carácter, mientras que LastDelimiter búsquedas de cualquiera de los diversos caracteres de la lista dada de posibilidades - piensa en StrRScan como LastDelimiter optimizado para un argumento de un carácter Delimiters.

+1

+1. Realmente debería aprender estas funciones tipo C algún día ... –

1

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; 
+0

muy bueno, porque con este código también es posible determinar la cantidad de ocurrencias de una subcadena en una cadena. ¡Esto me solucionó un problema ahora! gracias por tu contribución. – Saulo

Cuestiones relacionadas