5

我还没有弄清楚如何以更清洁的方式拆分字符串。

 ref: copy/part (find line "#") -15
 rest2: copy/part (skip (find line "#") 1) 450

-15 用于前往开头,450 用于前往结尾。

这不好,因为我看重了。

什么是正确的解决方案?

4

2 回答 2

6

预先警告:在 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 中编写的字符。

于 2013-04-25T10:54:49.853 回答
3

使用建议

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

于 2013-06-20T19:12:33.233 回答