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

标签 delphi delphi-2009 delphi-2010

是否有像 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/

相关文章:

delphi - 如何在 Delphi XE 中国际化我的应用程序?

security - 锁定 RAD Studio 内部浏览器安全

multithreading - 如何在不调用 .Sync 的情况下处理 AsyncCalls 函数中抛出的异常?

delphi - IXSLTemplate (MSXML 6) - 如何解析 xsl :import

delphi - 创建数据库感知组件 - TFieldDataLink.Edit 导致字段重新加载

delphi - 如何模拟 Alt+Shift 来更改 Windows 中的语言(第二部分)?

xml - 如何在Delphi 2009中解析此XML字符串?

delphi - 基于 key 的简单文本文件加密

Delphi 2010 SOAP 服务器

delphi - 每次 TDbGrid 的选定位置更改时都会触发什么事件?