有没有像PosEx这样的Delphi D2010函数,从字符串末尾开始在字符串中找到一个子字符串?
我正在删除对FastStrings库的所有调用,我使用的其中一个函数是FastPosBack:
function FastPosBack(const aSourceString,aFindString : AnsiString; const aSourceLen,aFindLen,StartPos : Integer) : Integer;
我找到了LastDelimiter,但它不是完全相同的东西,因为它只找到最后的分隔符而我无法指定起始位置.
谢谢!
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”错误以及需要一些它实际上没有使用的参数).