【发布时间】:2011-04-30 20:23:52
【问题描述】:
是否存在任何 RTL Delphi 函数来确定字符串中字符最后一次出现的位置?
【问题讨论】:
标签: string delphi delphi-2007
是否存在任何 RTL Delphi 函数来确定字符串中字符最后一次出现的位置?
【问题讨论】:
标签: string delphi delphi-2007
试试LastDelimiter 函数,它是 SysUtils 单元的一部分。
【讨论】:
RRUZ 回答了实际问题(他给了你一个 RTL 函数)。
不过,我还是忍不住给出一个简单的代码 sn-p 来做你想做的事:
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;
【讨论】:
在 SysUtils 单元中使用 StrRScan 或 AnsiStrRScan。后者,尽管它的名字,在string 是UnicodeString 的Delphi 版本中适用于Unicode 字符。 (如果您仍然需要“真正的”Ansi 版本,请使用 AnsiStrings 单元。)
这些函数只搜索一个字符,而 LastDelimiter 从给定的可能性列表中搜索多个字符中的任何一个 - 将 StrRScan 视为针对单个字符 Delimiters 参数优化的 LastDelimiter。
【讨论】:
最好的跨平台解决方案是TStringHelper.LastIndexOf,它从Delphi XE4开始就存在了。
注意,这个函数是从 0 开始的。
【讨论】:
这是我在字符串中查找子字符串第 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;
【讨论】: