function ReversePos(SubStr, S: String): Integer;var i : Integer;begin i := Pos(ReverseString(SubStr), ReverseString(S)); if i>0then i := Length(S)- i- Length(SubStr)+2; Result := i; end;调用的例子: ShowMessage (IntToStr(ReversePos('abc','abc123abc456')));
如果要查找最后一个位置,查找可以从头到尾查,效率会低些,不用DELPHI的,用POSEX就可以,查找后把查找点往后推就可以 从尾往头查,也可以 顺手给楼主写了个函数,参数VCL 中POSEX改写的, 简单测试了几个没发现问题,如果有什么问题,麻烦告诉我function PosExFromEnd(const SubStr, S: string): Integer; var I,X: Integer; Len, LenSubStr: Integer; begin I := Length(S); LenSubStr := Length(SubStr); Len := Length(S) - LenSubStr + 1; while Length(S) - I <= Len do begin if S[I] = SubStr[LenSubStr] then begin X := 1; while (X < LenSubStr) and (S[I - X] = SubStr[LenSubStr - X]) do Inc(X); if (X = LenSubStr) then begin Result := I - LenSubStr + 1; exit; end; end; Dec(I); end; Result := 0; end;procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage(IntToStr(PosExFromEnd('23', '123512156234567'))); end;
试了一下,下面这个函数不能通过编译; function ReversePos(SubStr, S: String): Integer; var i : Integer; begin i := Pos(ReverseString(SubStr), ReverseString(S)); //ReverseString变量没有声明 if i>0then i := Length(S)- i- Length(SubStr)+2; Result := i; end;[Error] Unit1.pas(60): Undeclared identifier: 'ReverseString' [Error] Unit1.pas(60): Incompatible types [Error] Unit1.pas(60): Incompatible types [Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
function ReversePos(SubStr, S: String): Integer;var
i : Integer;begin
i := Pos(ReverseString(SubStr), ReverseString(S));
if i>0then i := Length(S)- i- Length(SubStr)+2;
Result := i;
end;调用的例子: ShowMessage (IntToStr(ReversePos('abc','abc123abc456')));
需要注意的一点是这个函数是取最后一个分隔符的位置,单个字符的情况下没任何问题,可分隔符长度大于1时会有点问题。
比如 S:= 'ABCDEFG'
LastDelimiter('FG', S)=7 //应该为6才对,难道只匹配G?
LastDelimiter('GF', S)=7 //GF不是S的子串,可也和G进行了匹配。
呵呵。。 不知为什么要这样设计难道只支持一位的分隔符?
实在不行你就只能按上面说的POS +DELETE。
从尾往头查,也可以
顺手给楼主写了个函数,参数VCL 中POSEX改写的, 简单测试了几个没发现问题,如果有什么问题,麻烦告诉我function PosExFromEnd(const SubStr, S: string): Integer;
var
I,X: Integer;
Len, LenSubStr: Integer;
begin
I := Length(S);
LenSubStr := Length(SubStr);
Len := Length(S) - LenSubStr + 1;
while Length(S) - I <= Len do
begin
if S[I] = SubStr[LenSubStr] then
begin
X := 1;
while (X < LenSubStr) and (S[I - X] = SubStr[LenSubStr - X]) do
Inc(X);
if (X = LenSubStr) then
begin
Result := I - LenSubStr + 1;
exit;
end;
end;
Dec(I);
end;
Result := 0;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(IntToStr(PosExFromEnd('23', '123512156234567')));
end;
function ReversePos(SubStr, S: String): Integer;
var
i : Integer;
begin
i := Pos(ReverseString(SubStr), ReverseString(S)); //ReverseString变量没有声明
if i>0then i := Length(S)- i- Length(SubStr)+2;
Result := i;
end;[Error] Unit1.pas(60): Undeclared identifier: 'ReverseString'
[Error] Unit1.pas(60): Incompatible types
[Error] Unit1.pas(60): Incompatible types
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
处理PChar的可以做这件事情。
呵呵,找到了,告诉我一声,我比较健忘。