替换红色语言中多次出现的子字符串

Replacing multiple occurrences of substring in Red language

我正在尝试使用一个函数将发送的字符串中多次出现的 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"

我正在使用递归删除多次出现。它适用于单个测试线。但是,如果我正在测试上面的代码,它会产生堆栈溢出。问题出在哪里?

为什么你不使用 replace 或者 replace/all

replace/all oristr oripart newpart

你的审判失败了,因为你改变了,例如"this""THIS" 和 Red 一样 Rebol 大多不区分大小写,如果你不明确要求严格或大小写.所以它递归和递归。

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

如果你真的想使用自己的 strReplace 你应该使用 find/case

>> 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 
    ]