目前用的 
stringreplace
 在替换一条时很好用,但要有多条的话,
for i:=0 to xx do
begin
 stringreplace....
end;
发现在要匹配的子串很多,比如说上万 十万之类。会特别慢。 用fastreplace也不理想。 因为每替换一次就要把全文扫一变。每个子串扫一次,子串多了会特别慢。
貌似有个AC 叫多模式匹配 ??自己水平有限,没法实现。求大侠给点示例代码实现快速超多子串替换思路也可以~~~

解决方案 »

  1.   

    delphi中,也有正则表达式控件的,对字串匹配,它的算效率应该可以
    其中之一
    http://www.regular-expressions.info/delphi.html
    你可试一下
      

  2.   

    查找的数量较少的时候还是用正则吧,如果一定要自己写的话
    最简单的方法是自己遍历://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;
      

  3.   

    不是我想要的yyfhz 还是给分了吧