用Red语言替换多次出现的子字符串

时间:2017-09-27 10:30:15

标签: string stack-overflow rebol red

我正在尝试使用一个函数替换已发送字符串中多次出现的oripartnewpart

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"

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

1 个答案:

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