我正在尝试使用一个函数替换已发送字符串中多次出现的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"
我正在使用递归来删除多次出现。它适用于单个测试线。但是,如果我测试上面的代码,它会产生堆栈溢出。问题在哪里?
答案 0 :(得分:3)
为什么不使用替换或替换/全部
replace/all oristr oripart newpart
您的试用版会爆炸,因为您更改了“this”到“THIS”和红色与Rebol相同,如果您不要求明确严格或大小写,则大部分不区分大小写。所以它是递归和复审。
>> "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
]