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

sma*_*ins 9 delphi delphi-2009 delphi-2010

有没有像PosEx这样的Delphi D2010函数,从字符串末尾开始在字符串中找到一个子字符串?

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

function FastPosBack(const aSourceString, aFindString : AnsiString; const aSourceLen, aFindLen, StartPos : Integer) : Integer;
Run Code Online (Sandbox Code Playgroud)

我找到了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;
Run Code Online (Sandbox Code Playgroud)

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

Del*_*ics 9

试试这个/这些:

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;
Run Code Online (Sandbox Code Playgroud)

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

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


Dan*_*ski 8

您可以PosReverseString(来自StrUtils)结合使用