在线给分:如何实现字符串中反向查找一个子串的位置? ( 积分: 30 )

  • 主题发起人 主题发起人 bylove
  • 开始时间 开始时间
B

bylove

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手,如何实现再一个字符串中反向查找一个子串出现的位置(位置为正向)?
例如 :字符串:kg你是kg东东方kg不败,哈kg哈'你好''这adFEgskgef是
子串:kg
如何反向查找出最后一个kg的位置为:31?
最好有代码实现,在线等待给分!
 
各位高手,如何实现再一个字符串中反向查找一个子串出现的位置(位置为正向)?
例如 :字符串:kg你是kg东东方kg不败,哈kg哈'你好''这adFEgskgef是
子串:kg
如何反向查找出最后一个kg的位置为:31?
最好有代码实现,在线等待给分!
 
目前还没有可以反向选取字符串的函数吧?
不过下面代码可以实现你要的功能!

procedure TForm1.Button1Click(Sender: TObject);
var
i,j :integer;
StrTarget:string;
StrObj:String;
begin
StrTarget:=Self.Edit1.Text ;
strObj:=Self.Edit2.text;
i:= pos(strobj,strtarget);
j:=0;
if i>0 then
begin
repeat
begin
j:=j+i;
StrTarget:=copy(StrTarget,i+length(Strobj),length(Strtarget));
i:= pos(strobj,strtarget);

end;
until i=0 ;
end;
showmessage (inttostr(j));
end;

如果可以请揭帖
 
你题中结果不会返回31的
因为字符串中有中文字符!
所以结果为40
 
//str1字符串 str2子串
j := 0;
for i := length(str1)-length(str2)+1 downto 1 do
begin
strTemp := copy(str1,i,length(str2));
if strTemp = str2 then
begin
j := i
//j是子串的位置(unicode做2个字符)
break;
end;
end;
result := j;
for k ;= 1 to j do
begin
if ord(str1[k])<128 then
begin
result := result+1
//如果不是unicode加1
end;
end;
result := Round(result/2)
//舍入取整
 
要得到汉字和英文中准确位置
将Wanshi131和我的方法结合起来,
编译通过!
 
有现成的函数可以用啊:
SearchBuf function
 
Uses部分 + StrUtils;

function LastPos(const SubStr, S: string): Integer;
var
FPos: integer;
CutStr: string;
begin
FPos := 0;
repeat
Result := FPos;
FPos := PosEx(SubStr, S, FPos + 1);
Until Fpos = 0;

if Result = 0 then Exit;
CutStr := copy(S, 1, Result - 1);
Result := length(WideString(CutStr)) + 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
Str = 'kg你是kg东东方kg不败,哈kg哈''你好''''这adFEgskgef是';
begin
TButton(Sender).Caption := inttostr(LastPos('kg', str));
end;
 
来自:HuangJH, 时间:2005-10-12 12:35:16, ID:3234898

StrTarget:=copy(StrTarget,i+length(Strobj),length(Strtarget));
这句算法有错误。
例如 s= 'ababa', substr = 'aba' 时,答案应该是 3 而不是 1。

频繁使用 copy是会导致效率问题,尤其是长字符串。
 
to jeffrey_s:你的算法里面的中文字作为一个长度处理,其实该两个长度,我的问题里问的有误,不好意思!10分聊表意思,下次再补;
to HuangJH:你的算法也可以,不过老用Copy函数容易效率不高;给12分意思意思;

大家在:http://www.delphibbs.com/delphibbs/dispq.asp?lid=1638520可以找到答案,我参考此贴优化了部分代码,很爽,大家一起进步吧!
 
to jeffrey_s:你的算法里面的中文字作为一个长度处理,其实该两个长度,我的问题里问的有误,不好意思!10分聊表意思,下次再补;
to HuangJH:你的算法也可以,不过老用Copy函数容易效率不高;给12分意思意思;

大家在:http://www.delphibbs.com/delphibbs/dispq.asp?lid=1638520可以找到答案,我参考此贴优化了部分代码,很爽,大家一起进步吧!
 
后退
顶部