gpt4 book ai didi

delphi - 有没有像 PosEx 这样的内置 Delphi 函数可以从字符串的后面找到子字符串?

转载 作者:行者123 更新时间:2023-12-03 14:42:33 27 4
gpt4 key购买 nike

是否有像 PosEx 这样的 Delphi D2010 函数可以从字符串末尾开始查找字符串内的子字符串?

我正在删除对 FastStrings 库的所有调用,我使用的函数之一是 FastPosBack:

function FastPosBack(const aSourceString, aFindString : AnsiString; const aSourceLen, aFindLen, StartPos : Integer) : Integer;

我找到了 LastDelimiter,但它并不完全相同,因为它只找到最后一个分隔符,而我无法指定开始位置。

谢谢!

更新:根据 DR 评论,我创建了此函数:

function FastPosBack(const aSourceString, aFindString : String; const aSourceLen, aFindLen, StartPos : Integer) : Integer;
var
RevSourceString, RevFindString: string;
begin
RevSourceString := AnsiReverseString(aSourceString);
RevFindString := AnsiReverseString(aFindString);

Result := Length(aSourceString) - PosEx(RevFindString, RevSourceString, StartPos) + 1;
end;

有没有更有效的方法?在 1000000 次循环周期中,Pos 需要 47ms,而 FastPosBack 需要 234ms 才能完成。

最佳答案

尝试这个/这些:

function RPos(const aSubStr, aString : String; const aStartPos: Integer): Integer; overload;
var
i: Integer;
pStr: PChar;
pSub: PChar;
begin
pSub := Pointer(aSubStr);

for i := aStartPos downto 1 do
begin
pStr := @(aString[i]);
if (pStr^ = pSub^) then
begin
if CompareMem(pSub, pStr, Length(aSubStr)) then
begin
result := i;
EXIT;
end;
end;
end;

result := 0;
end;


function RPos(const aSubStr, aString : String): Integer; overload;
begin
result := RPos(aSubStr, aString, Length(aString) - Length(aSubStr) + 1);
end;

重载提供了一种调用 RPos 的方法,使用最有效的起始位置从字符串的最末尾开始搜索,而无需自己计算。为了提高效率,在明确指定时不会对 startpos 执行检查。

在我的 SmokeTest 性能测试套件中,这比 FastPosBack 快大约 20%(FastPosBack 顺便包含一个“相差一”错误,并且需要一些实际上并不使用的参数)。

关于delphi - 有没有像 PosEx 这样的内置 Delphi 函数可以从字符串的后面找到子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1548100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com