目前用的
stringreplace
在替换一条时很好用,但要有多条的话,
for i:=0 to xx do
begin
stringreplace....
end;
发现在要匹配的子串很多,比如说上万 十万之类。会特别慢。 用fastreplace也不理想。 因为每替换一次就要把全文扫一变。每个子串扫一次,子串多了会特别慢。
貌似有个AC 叫多模式匹配 ??自己水平有限,没法实现。求大侠给点示例代码实现快速超多子串替换思路也可以~~~
stringreplace
在替换一条时很好用,但要有多条的话,
for i:=0 to xx do
begin
stringreplace....
end;
发现在要匹配的子串很多,比如说上万 十万之类。会特别慢。 用fastreplace也不理想。 因为每替换一次就要把全文扫一变。每个子串扫一次,子串多了会特别慢。
貌似有个AC 叫多模式匹配 ??自己水平有限,没法实现。求大侠给点示例代码实现快速超多子串替换思路也可以~~~
其中之一
http://www.regular-expressions.info/delphi.html
你可试一下
最简单的方法是自己遍历://srcStr:原始字符串
//targetStr:替换后的结果
//fundStrArray:需要搜索的子串数组
//replaceStrArray:对应的需要替换成为的字串数组
srcIndex:= 1;
targetStr:= "";
while srcIndex <= length(srcStr) do
begin
replaced:= false;
for i:=0 to length(fundStrArray)-1
begin
if copy(srcStr,srcIndex, length(fundStrArray[i]))= fundStrArray[i] then
begin
targetStr:= targetStr+replaceStrArray[i];
replaced:= true;
srcIndex:= srcIndex+length(fundStrArray[i]);
break;
end ;
end;
if not replaced then
targetStr:= targetStr+copy(srcStr,srcIndex,1);
end;这样做原始串只需要遍历一次,当搜索子串在原始串中出现较为频繁且搜索子串长度较长是比较适用。
但同时,如果原始串中没有找到搜索子串的话,则算法需要对原始串中的每一个字符都进行判断,会比较费时间。
如果可以增加较多的临时空间,一个折中的方法是对先用pos方法对各个搜索子串进行一次搜索,然后根据搜索的结果依次进行替换。
先准备一个类似inStr的函数:function integer inStr(str: String, subStr: String; firstIndex: Integer)
var
str1: String;
begin
if firstIndex> length(str) then
Result:= 0
else
begin
str1:= copy(str,firstIndex, length(str)); //通过Copy来截取字符串,这种方法肯定有性能问题,这里只是偷懒这么做了,有兴趣的可以自己去写一个快速查找的方法。
Result:= pos(subStr, str1);
end;
if Result>0 then
Result:= Result+firstIndex-1;
end ;然后...//srcStr:原始字符串
//targetStr:替换后的结果
//fundStrArray:需要搜索的子串数组
//fundStrPosArray:需要搜索的子串数组在尚未处理的字符串中的位置(0表示未找到)
//replaceStrArray:对应的需要替换成为的字串数组
targetStr:= "";
srcIndex:= length(srcStr)+1;
for i:= 0 to length(fundStrArray)-1 do
begin
fundStrPosArray[i]:= inStr(srcStr, fundStrArray[i],1);
if (fundStrPosArray[i]>0) and(fundStrPosArray[i]<srcIndex) then
srcIndex:= fundStrPosArray[i];
end ;
//最前面不需要替换的字符串
if srcIndex>1 then
targetStr:= targetStr+copy(srcStr,prevSrcIndex, srcIndex-1);//替换过程
while srcIndex <= length(srcStr) do
begin
prevSrcIndex:= srcIndex;
srcIndex:= length(fundStrArray)+1;
fundStrIndex:= -1;
for i:=0 to length(fundStrArray)-1
begin
if (fundStrPosArray[i]>0) and (fundStrPosArray[i]<prevSrcIndex) then
//该字符串的位置已经无效了,需要重新搜索
fundStrPosArray[i]:=inStr(srcStr, fundStrArray[i],prevSrcIndex);
//替换测试(找到第1个出现的可替换字符串)
if (fundStrPosArray[i]>0) and (fundStrPosArray[i]<srcIndex) then
begin
srcIndex:= fundStrPosArray[i];
fundStrIndex:= i;
if srcIndex= prevSrcIndex then
break;
end;
end;
//插入不需要替换的字符串
if srcIndex> prevSrcIndex then
targetStr:= targetStr+copy(srcStr,prevSrcIndex, srcIndex-prevSrcIndex);
//开始替换
if fundStrIndex>0 then
begin
targetStr:= targetStr+copy(replaceStrArray[fundStrIndex]);
srcIndex:= fundStrPosArray[i]+length(fundStrArray[i]);
end;
end;