如何在Rebol中的特定字符处拆分字符串

时间:2013-04-25 10:31:34

标签: rebol

我还没弄清楚如何以更干净的方式分割字符串。

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

-15用于开始,450用于结束。

这不好,因为我放了价值。

什么是正确的解决方案?

2 个答案:

答案 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