我还没弄清楚如何以更干净的方式分割字符串。
ref: copy/part (find line "#") -15
rest2: copy/part (skip (find line "#") 1) 450
-15用于开始,450用于结束。
这不好,因为我放了价值。
什么是正确的解决方案?
答案 0 :(得分:5)
预先警告:在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”细化(试试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的信息,一个好的起点是值得尊敬的"Parsing" chapter in the REBOL/Core Users Guide(最初是为REBOL 2.3编写的,但在当前的REBOL 2和3版本中基本相同仍然基本相同)。
最后的一个辅助说明:您还可以使用在Rebol中写为"#"
的字符,而不是单项字符串#"#"
。
答案 1 :(得分:2)
使用建议
set [ref rest2] parse line "#"
不会给你想要的东西 更好地使用
set [ref rest2] parse/all line "#"
,因为没有/ all的解析是Rebol表示法中用于解析csv字符串或解析Rebol表示法的特殊情况。
没有/所有“#”只是添加到已经定义的空格分隔符等
你会得到这个
== [“this”“is”“foo”“and”“here”“come”“a”“long”“bar”]
将前两个元素分配给ref和rest2