一个字符串的替换问题!在线急等。。。。。(100分)

  • 主题发起人 主题发起人 wyjch78
  • 开始时间 开始时间
W

wyjch78

Unregistered / Unconfirmed
GUEST, unregistred user!
我想替换一个字符串,例如原来的字符串‘x pp wy1 oop pp’,我想对应的把'pp'替换成'王' ,'wy1'替换成'赵'.得到结果‘x 王 赵 oop 王’.注意里面的对应关系是一张表,数据量挺大的。急等。谢谢
 
没有回复的,自己先顶一个!
 
uses StrUtils;

AnsiReplaceStr(str, 'pp', '王');
 
楼上的方法可以...
 
我可能没有说清楚。里面的‘pp’,‘王’只是一个例子。我想肯定需要循环的吧。
 
var
newstr:string
for i:=1 to length(oldstr) do
begin
if (copy(oldstr,i,1)='p') and (copy(oldstr,i+1,1)='p') then
newstr:=newstr+'王'
else newstr:=newstr+copy(oldstr,i,1);

end;
 
用StringReplace函数。
 
type
TStrReplace = record
SrcStr: string;
DesStr: string;
end;

TRpStrArray: array of TStrReplace;

var
tmpStr: string;
RpStrArray: TRpStrArray;
i, j: Integer;
begin
{ 先把需要替换的对应字符串导入动态数组 }
.....
{ 再对需要替换的字符串进行替换 }
for i := Low(RpStrArray) to High(RpStrArray) do
begin
StringReplace(tmpStr, RpStrArray.SrcStr, RpStrArray.DesStr,
[rfReplaceAll]);
end;
end;
 
stringReplace*('x pp wy1 oop pp','pp','王',[rfReplaceAll]);
 
function ReplaceTextA(var SText: string; TextFind, TextReplace: string);string;
var
S: string;
SLen: LongInt;
SPos: Integer;
begin
S := '';
SLen := Length(TextFind);
SPos := Pos(TextFind, SText);
while SPos > 0 do
begin
S := S + Copy(SText, 1, SPos - 1) + TextReplace;
Delete(SText, 1, SPos + SLen - 1);
SPos := Pos(TextFind, SText);
end;
S := S + SText;
SText := S;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
s:='x pp wy1 oop pp';
ReplaceTextA(s,'pp','王');
memo1.Text:=s;
end;
 
其实我的字符串是一个excel中的每一个cell,AdoQuery1对应我的对应表,这个是固定的两列,原来我处理的程序是这样的:
for k:=0 to ExcelWorksheet1.UsedRange[0].Columns.Count -1 do
for j:=0 to ExcelWorksheet1.UsedRange[0].Rows.count-1 do
begin
if AdoQuery1.Locate(''+DBGrid1.Columns.Items[0].FieldName+'',trim(ExcelWorksheet1.Cells.Item[j+1,k+1]),[]) then
ExcelWorksheet1.Cells.Item[j+1,k+1]:=adoQuery1.Fields[1].AsString;
但是这样只能处理整个字符串相同的情况,现在的情况是我不知道怎么替换字符串中的字符串了。我自己改过一个,速度太慢受不了。有没有哪个高手帮我出出注意。
 
既然在Excel中,就用编辑|替换功能
呵呵
 
处理量大的话用replace可能太慢,最好自己根据状态机原理写个扫描替换函数
 
EXCEL里可以考虑用宏
 
to :sbzldlb 有问题啊。
var
newstr:string;
i:integer;
begin
i:=1 ;
while (i<=length(str) )do
begin
if (copy(oldstr,i,1)='p') and (copy(oldstr,i+1,1)='p') then
begin
newstr:=newstr+'王' ;
i:=i+2;
end
else
begin
newstr:=newstr+copy(str,i,1);
i:=i+1;
end;
end;

edit1.Text:=newstr;
end;

要不出3个以上的p时如'ppp'就替换成了‘王王p’了
 
用正则表达式来
 
To dos1234,能具体讲讲怎么使用吗?正则表达我没有用过的!
 
看看这个 http://www.delphibbs.com/delphibbs/dispq.asp?lid=283208
2000年的时候 DreamTiger 写的一个快速字符串替换函数,汇编写的,我没用过,据“
wint (2000-05-19 14:57:00) ”评价:
“确实很猛。4194306次替换,需时1秒左右。”

我想应该能解决你的瓶颈问题了。
 
用循环,再用STRINGREPLACE函数就可以了.
 
TO 李翔鹏,你能写一个吗?我自己写过一个,速度太慢了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部