问题描述
我想用 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"]