在 Red 语言中,如何使用 split 拆分字符串,但也将分隔符保留为 nessecary

问题描述

我想用 split 分割一个字符串,同时该字符串包含用作分隔符的字符串,不应将其视为分隔符。我以这种方式尝试过,如下代码所示:

>> split {1 + 3 `to-string #"^(60)"`c} "`"
== ["1 + 3 " {to-string #"} {"} "c"] ;;I think it should be ["1 + 3 " {to-string #"^(60)"}"c"] 
此处使用的

to-string #"^(60)" 是为了避免出现将被称为分隔符的“``”,但它失败了。似乎 ^(60) 被评估为“```”,然后被 split 用作分隔符。 那么,Red 语言中 split 的机制是什么?以及如何拆分字符串同时保留那些不应被视为分隔符的分隔符。

解决方法

^(60) 是所谓的 代码点表单,它作为 ` 字符加载。

>> "^(60)"
== "`"

如果你想避免这种情况,你应该手动转义它:

>> {1 + 3 `to-string #"^^(60)"` c}
== {1 + 3 `to-string #"^^(60)"` c}

或者使用原始字符串:

>> %{1 + 3 `to-string #"^(60)"` c}%
== {1 + 3 `to-string #"^^(60)"` c}

split事后处理很简单:

>> split %{1 + 3 `to-string #"^(60)"` c}% #"`"
== ["1 + 3 " {to-string #"^^(60)"} " c"]

如果你想在那里保留 ` 字符,那么 split 不会剪掉它。你需要像 Parse 这样的东西:

>> string: {1 + 3 `to-string #"`"` c}
== {1 + 3 `to-string #"`"` c}
>> parse string [collect [keep to " `" " `" keep to "` " "` " keep copy match to end]]
== ["1 + 3" {to-string #"`"} "c"]
>> parse string [collect some [keep copy _ to copy match [" `" | "` " | end] match]]
== ["1 + 3" {to-string #"`"} "c"]