-1

我尝试递归替换找到的文本,但我无法让它工作。这将只替换每个“文本”之前的 1 个“a”字符,但我想替换文本之前的所有“a”字符

//Declared recursive function
function OneLine(s:WideString):WideString;
begin
s:=StringReplace(s,'atext', 'text', [rfReplaceAll]);

if (Pos(Result,'atext')>0) then
 begin
 //XMLstring:=Result;
 s:=OneLine(XMLstring);
 end
 else
 begin
 Result:=XMLstring;
 end;
end;

//--Here begins program
Var
t:string
Begin

//exaple of text 
//we need replace all 'a' before 'text' only
t:='aaHaaatextaaaatextHHaatextHHaaaa';

//call custom recursive function
t:=OneLine(t); 

ShowMessage(t);

End.

我需要替换这个:'aaHaaatextaaaatextHHaatextHHaaaa'

最终文本应如下所示:'aaHtexttextHHtextHHaaaa'

4

3 回答 3

4

尝试这个

function OneLine(const S, OldPattern, NewPattern: string):string;
begin
 Result:=s;
 repeat
  Result:=StringReplace(Result, OldPattern, NewPattern, [rfReplaceAll]);
 until Pos(OldPattern, Result)=0;
end;

并像这样使用

OneLine('aaHaaatextaaaatextHHaatextHHaaaa','atext','text')
于 2013-07-03T18:06:01.497 回答
2

您的递归逻辑是错误的,更不用说比它需要的更复杂了。试试这个:

function OneLine(const s: WideString): WideString;
begin
  if Pos(WideString('atext'), s) > 0 then
    Result := OneLine(StringReplace(s, 'atext', 'text', [rfReplaceAll]))
  else
    Result := s;
end;

另外,您确实意识到StringReplace()不支持WideString,不是吗?因此,您在每一步都进行了大量不必要的 WideString 到 String 到 WideString 的数据转换。更改OneLine()为取并返回 a String,以便它可以继续使用StringReplace()并且WideString仅在初始调用站点执行转换:

function OneLine(const s: String): String;
begin
  if Pos('atext', s) > 0 then
    Result := OneLine(StringReplace(s, 'atext', 'text', [rfReplaceAll]))
  else
    Result := s;
end;

或者重新实现完全OneLine()停止使用StringReplace(),而是手动搜索和替换使用WideString值。

于 2013-07-03T20:02:25.750 回答
0

谢谢这对我帮助很大。由于 unicode 支持,我使用了宽字符串函数,但字符串函数似乎也适用于 UTF-8(可能取决于 Delphi 的版本,我使用的是 Turbo delhpi 7)。我用它来格式化 UTF-8 编码的 xml 文件中的字符串。

function OneLineCDATA(const s: String): String;
begin
  if Pos(#9+'<![CDATA[', s) > 0 then
    Result := OneLineCDATA(StringReplace(s, #9+'<![CDATA[', '<![CDATA[', [rfReplaceAll]))
  else
    if Pos(#13+#10+'<![CDATA[', s) > 0 then
      Result := OneLineCDATA(StringReplace(s, #13+#10+'<![CDATA[', '<![CDATA[', [rfReplaceAll]))
     else
        if Pos(']]>'+#13+#10, s) > 0 then
          Result := OneLineCDATA(StringReplace(s, ']]>'+#13+#10, ']]>', [rfReplaceAll]))
        else
          if Pos(']]>'+#9, s) > 0 then
            Result := OneLineCDATA(StringReplace(s, ']]>'+#9, ']]>', [rfReplaceAll]))
           else
             Result := s;

end;
于 2013-07-04T10:03:19.527 回答