任何内置的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”错误以及需要一些它实际上没有使用的参数). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |