是否存在任何RTL Delphi函数来确定字符串中最后一次出现char的位置?
答案 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 单元中使用StrRScan
或AnsiStrRScan
。后者尽管有其名称,但在Delphi版本中使用string
为UnicodeString
的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;