在字符串中查找最后一次出现的char

时间:2011-04-30 20:23:52

标签: string delphi delphi-2007

是否存在任何RTL Delphi函数来确定字符串中最后一次出现char的位置?

5 个答案:

答案 0 :(得分:27)

尝试LastDelimiter函数,它是SysUtils单元的一部分。

答案 1 :(得分:17)

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)语法时)并且可能稍快一些。但是,在Delphi 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;

答案 2 :(得分:11)

SysUtils 单元中使用StrRScanAnsiStrRScan。后者尽管有其名称,但在Delphi版本中使用stringUnicodeString的Unicode字符。 (如果您仍需要“真正的”Ansi版本,请使用 AnsiStrings 单元。)

这些函数只搜索一个字符,而LastDelimiter搜索给定可能列表中的几个字符中的任意一个字符 - 将StrRScan视为针对单字符优化的LastDelimiter Delimiters {1}}论证。

答案 3 :(得分:3)

最好的跨平台解决方案是TStringHelper.LastIndexOf,它自Delphi XE4以来就存在。

注意,此功能从0开始。

答案 4 :(得分: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;