2013-07-03 90 views
-1

我試着替換髮現的文本遞歸,但我不能讓它工作。 這將只更換1'a'字符每個'text'之前,但我想文本之前替換所有'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'

+0

閱讀「Pos」的文檔,第一個參數是您要搜索的字符串。然後在同一行放置一個斷點,並檢查斷點被命中時「結果」保存的內容。 –

+0

你應該使用一個和如果內部,你會很容易地解決你的問題;) –

+1

什麼是XMLString?複製並粘貼您的真實代碼。 –

回答

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') 
+0

謝謝,但這不是遞歸函數。我已經嘗試while循環,它的工作,但我嘗試獲得工作函數,將自己調用=遞歸功能 – Nafalem

+2

爲什麼你需要一個遞歸函數? – RRUZ

+0

因爲...爲什麼不:) – Nafalem

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-to-String-to-WideString數據轉換。更改OneLine()採取並返回一個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值。

0

感謝這幫了我很多。由於unicode的支持,我使用了widetring函數,但它似乎也是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; 
+0

疼痛等待。使用真正的XML庫。 –