2011-04-30 115 views

回答

24

尝试作为SysUtils单元的一部分的LastDelimiter函数。

+0

System.SysUtils.TStringHelper.LastIndexOf当你想要一个字符串而不是一个字符时也可以很方便。 – Ampere 2017-04-07 08:59:05

12

RRUZ回答了实际问题(他给了你一个RTL函数)。

不过,我不能完全抵挡给人一种简单的代码片段,你想要做什么:

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; 

因为这不正是你想要什么,不提供其他功能,这是更为紧凑的(特别是当我们使用Delphi 2009及更高版本的Exit(Result)语法),可能稍微快一点。 2007年德尔福,但是,你必须做

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

为什么我在同一时间给出的每个答案都低估了?! – 2011-05-03 17:41:43

+1

+1同情:) – Funk247 2014-08-14 13:15:51

11

使用StrRScanAnsiStrRScan,无论是在sysutils的单元。后者尽管有其名称,但仍适用于Delphi版本中的Unicode字符,其中stringUnicodeString。 (如果您仍然需要“真实”的ANSI版本,使用AnsiStrings单位)。

这些功能搜索的一个字符,而LastDelimiter搜索任何从可能性的定列表几个大字 - 想StrRScanLastDelimiter针对单字符Delimiters参数进行了优化。

+1

+1。我真的应该在某天学习这些类C函数...... – 2011-04-30 21:26:20

1

这里是我对找到字符串中第n个子字符串出现位置的贡献。

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

非常好,因为使用此代码也可以确定字符串中子字符串的出现次数。这给我解决了一个麻烦!感谢你的贡献。 – Saulo 2017-10-05 18:32:11

相关问题