加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

任何内置的Delphi函数,如PosEx,从字符串后面找到一个子字符串?

发布时间:2020-12-15 03:50:05 所属栏目:大数据 来源:网络整理
导读:有没有像PosEx这样的Delphi D2010函数,从字符串末尾开始在字符串中找到一个子字符串? 我正在删除对FastStrings库的所有调用,我使用的其中一个函数是FastPosBack: function FastPosBack(const aSourceString,aFindString : AnsiString; const aSourceLen,aF
有没有像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,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;

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

在我的SmokeTest性能测试套件中,这比你的FastPosBack快20%左右(偶然包含一个“off by one”错误以及需要一些它实际上没有使用的参数).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读