2017-09-27 46 views
0

我想有一個功能,發送字符串替換的oripart多次出現,以newpart更換子多次出現在紅語言

strReplace: func [str [string!] oripart [string!] newpart [string!]][ 
     if find str oripart [ 
      change find str oripart newpart 
      strReplace str oripart newpart ] ; recursion to change more occurrences; 
     str ] 

print strReplace "this is a short line" "short" "small" 
print strReplace "this is a short line" "this" "THIS" 
print strReplace "this is a short line" "line" "LINE" 
print strReplace "this is a long line" "short" "small" 
print strReplace "this is a short short line" "short" "small" 

我使用遞歸刪除多次出現。它適用於單一測試線。但是,如果我正在測試代碼,它會產生堆棧溢出。哪裏有問題?

回答

3

爲什麼你不要只使用更換替換/全部因你而改變例如

replace/all oristr oripart newpart

您的試用炸燬「this」 to 「THIS」和Red相同,Rebol大多不區分大小寫,如果你不明確要求strict或case。所以它遞歸和遞歸。

>> "this" = "THIS" 
== true 
>> "this" == "THIS" 
== false 
>> find "this" "THIS" 
== "this" 

如果你真的想用自己的strReplace你應該使用查找/箱

>> find/case "this" "THIS" 
== none 

還有一個解決問題的方法;在

strReplace: func [ 
     str [string!] oripart [string!] newpart [string!] 
    ][ 
     if find str oripart [ 
      str: change find str oripart newpart 
      strReplace str oripart newpart ; recursion to change more occurrences; 
     ] 
     head str 
    ] 
+0

之後在一個位置遞減遞減是的,發現/案例是真正的問題。 – rnso

+0

改爲使用** replace/all **,因爲它會取代所有的出現 – sqlab