替换红色语言中多次出现的子字符串
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
]
我正在尝试使用一个函数将发送的字符串中多次出现的 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
]