我还没有弄清楚如何以更清洁的方式拆分字符串。
ref: copy/part (find line "#") -15
rest2: copy/part (skip (find line "#") 1) 450
-15 用于前往开头,450 用于前往结尾。
这不好,因为我看重了。
什么是正确的解决方案?
我还没有弄清楚如何以更清洁的方式拆分字符串。
ref: copy/part (find line "#") -15
rest2: copy/part (skip (find line "#") 1) 450
-15 用于前往开头,450 用于前往结尾。
这不好,因为我看重了。
什么是正确的解决方案?
预先警告:在 Rebol 中有许多不同的方法可以实现这一点。所以你可能会得到很多不同的建议。
首先,让我们坚持使用 FIND 的原始方法。
当您将 FIND 与系列一起使用时,您将获得对基础系列数据的新视图,该视图位于与系列数据开头不同的偏移量处。
让我们从一些示例数据开始:
>> line: copy "this is foo#and here comes a long bar"
== "this is foo#and here comes a long bar"
让我们#
找到该行中的字符,并将结果称为 POS:
>> pos: find line "#"
== "#and here comes a long bar"
如您所见,这基本上已经为您提供了拆分的第二部分(您称之为 REST2)。您只需跳过分隔符本身(然后复制结果字符串,使其独立于原始 LINE 字符串):
>> rest: copy next pos
== "and here comes a long bar"
为了提取初始部分,您可以使用 COPY/part 的一个不错的功能。“/part”改进(try help copy
)的文档说:“限制到给定的长度或位置”(强调我的)。我们已经将这个位置作为 POS 方便。所以:
>> ref: copy/part line pos
== "this is foo"
你去吧!完整代码:
pos: find line "#"
ref: copy/part line pos
rest: copy next pos
作为参考,这是一个基于 PARSE 的方法:
parse line [copy ref to "#" skip copy rest to end]
我会让这个保持不变,无需进一步解释。如果您想了解更多关于 PARSE 的信息,可以从REBOL/Core 用户指南(最初为 REBOL 2.3 编写,但当前 REBOL 2 和 3 版本中的基本内容基本相同)中古老的“解析”一章开始。 )。
最后附注:除了单项字符串"#"
,您还可以使用#"#"
在 Rebol 中编写的字符。
使用建议
set [ref rest2] parse line "#"
不会给你想要的。
更好地使用
set [ref rest2] parse/all line "#"
, 因为没有 /all 的解析是 Rebol 表示法中用于解析 csv 字符串或解析 Rebol 表示法的特殊情况。
没有 /all "#" 只是添加到已经定义的空白分隔符等。
你会得到这个
== ["this" "is" "foo" "and" "here" "comes" "a" "long" "bar"]
前两个元素分配给 ref 和 rest2