【问题标题】:Rebol: how to split a string into charactersRebol:如何将字符串拆分为字符
【发布时间】:2019-07-10 15:42:01
【问题描述】:

如何使用 Rebol 将此字符串拆分为字符(不使用带有循环的类似 c 的方法)?我使用的是没有 split 方法的版本 2.7.8.2.5。

str: "今天是星期一"

我想把上面的分成:

[ 'T' 'o' 'd' 'a' 'y' ' ' 'i' 's' ' ' 'M' 'o' 'n' 'd' 'a' 'y']

Parse 方法似乎只是将一个句子拆分为组成词。

谢谢。

【问题讨论】:

  • 请注意,单撇号不是 Rebol 中单个字符的表示法(如果前导是引号字符,如果在单词中间是标识符字符)。所以字符是#"x"。但是,changing this is being discussed right now...(我的时钟是星期三:-P)

标签: parsing rebol rebol2


【解决方案1】:

如果你不想使用循环,有一个绝妙的技巧:

>> head extract/into str 1 []  
== [#"T" #"o" #"d" #"a" #"y" #" " #"i" #"s" #" " #"M" #"o" #"n" #"d" #"a" #"y"]

OTOH,string! 已经是一系列 char! 值,因此将其分解为这样的字符并不会带来任何明显的好处。

【讨论】:

  • 谢谢!只是为了让我明白; “提取”大小为“1”列的字符串中的每个字符;细化 'into' 将字符存储到数组缓冲区中;形成块数据类型;返回系列的“头”?
  • @awyr_agored 您可以研究extract 如何与source extract 一起工作,但基本上它会定期从系列(本例中为string!)中提取(因此得名)值(这里它是1)。 /into 表示将提取的值放在哪里 - 我给了它一个空的 block!head 这里是重置块回到开头,因为在 R2 中 extract/into 出于某种原因返回一个尾巴。
【解决方案2】:

在某些 Rebols(不是 Rebol2)中,您可以使用 MAP-EACH 来执行此操作,例如ma​​p-each ch str [ch].

在 Rebol2 中,COLLECT 和 KEEP 是相当通用且强大的构建块的方法:

>> collect [foreach c str [keep c]]
== [#"T" #"o" #"d" #"a" #"y" #" " #"i" #"s" #" " #"M" #"o" #"n" #"d" #"a" #"y"]

我会给你一个,然后让其他人列出无数种更快的方法。 :-)

【讨论】:

    【解决方案3】:

    如果你想获得长度为 1 的单个字符或字符串,你也可以使用 parse 并遵循以下规则

    >> str: "Today is Monday"
    == "Today is Monday"
    >> collect [parse/all str [some [copy x  skip (keep x)    ]     ]]
    == ["T" "o" "d" "a" "y" " " "i" "s" " " "M" "o" "n" "d" "a" "y"] 
    >> collect [parse/all str [some [x: skip (keep x/1)]]]
    == [#"T" #"o" #"d" #"a" #"y" #" " #"i" #"s" #" " #"M" #"o" #"n" #"d" #"a" #"y"]
    

    红色允许更紧凑的版本

    >>   parse str [collect [some [keep skip]]]
    == [#"T" #"o" #"d" #"a" #"y" #" " #"i" #"s" #" " #"M" #"o" #"n" #"d" #"a" #"y"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多