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

前端之家收集整理的这篇文章主要介绍了任何内置的Delphi函数,如PosEx,从字符串后面找到一个子字符串?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有像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”错误以及需要一些它实际上没有使用的参数).

猜你在找的Delphi相关文章