【问题标题】:How to split a string into key-value pairs?如何将字符串拆分为键值对?
【发布时间】:2013-05-18 08:27:47
【问题描述】:

假设我有一个字符串,例如

"@a ipsum lorem @b dolor sit amet @c consectetur adipisicing"

我想转换为数组(或哈希,或某种键和值模式)

{ @a => "ipsum lorem", @b => "dolor sit amet", @c => "consectetur adipisicing" }

这可能吗?如果可以,怎么做?

一些要点:

  • 键是不可能发生冲突的已知值列表 与字符串中的其他单词。
  • 键被指定为 符号@
  • 键可能长于一个字符,例如@钥匙, @longer-key。
  • 我正在使用带有 Ruby 1.9.3 的 Rails 3.2。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:
    s = "@a ipsum lorem @b dolor sit amet @c consectetur adipisicing"
    Hash[s.split(" ").slice_before(/@/).map{|k,*v|[k,v.join(" ")]}]
    #=> {"@a"=>"ipsum lorem", "@b"=>"dolor sit amet", "@c"=>"consectetur adipisicing"}
    

    【讨论】:

    • 感谢@priti,这是一个优雅的解决方案!一个问题 - 如果我没有符号 @ 而是有一个值列表,可以将它们传递给 splice_beofore 方法吗?类似s.chars.splice_before(["a","b","c"])
    • 如果变量名不是单个字符,这将有问题。例如s = "@alpha ipsum lorem @b dolor sit amet @c consectetur adipisicing"
    • @Rahulgarg 这都是关于编程的,你所指的东西,如果是这样的场景也可以这样处理,或者我也可以使用其他技术。但根据 OP 的帖子,我使用了这种技术。对于当前的示例,它也会如此。
    【解决方案2】:
    Hash[s.scan(/\@\w+/).zip s.split(/\s?\@\w+\s/).drop(1)]
    

    【讨论】:

    • 这是一个很好的解决方案。我使用Benchmark.measure 比较了这个解决方案 (0.000059) 和 Priti (0.000097) 的性能。由于此解决方案在提供的字符串上更快,因此我正在更改接受的答案。
    【解决方案3】:
     s = "@a ipsum lorem @b dolor sit amet @c consectetur adipisicing"
     hs = {}
     s.split('@').drop(1).each{|val| tmp = val.split(' '); hs["@#{tmp.shift}"] = tmp.join(' ')   }
     # puts hs
     #=>{"@a"=>"ipsum lorem", "@b"=>"dolor sit amet", "@c"=>"consectetur adipisicing"}
    

    【讨论】:

    • 谢谢,这行得通!一个问题 - 如果我没有使用符号 @ 而是有一个值列表,是否可以将这些值传递给 split 方法?类似s.split(["a","b","c"])
    • 但是 "a" "b" "c" 也可以是值.. 比如 s = "@a a b @b x y z "
    • 以上是非常具体的,假设你的变量是在@var_names 定义的,rest 是它的值,直到下一个@var 被定义;
    • @AndyHarvey 这就是你想要的吗?那么你的问题是错误的。
    • @sawa,实际上在我的情况下,键确实有@符号,我的问题更多是出于兴趣。
    【解决方案4】:
    Hash[
      string
      .scan(/(@\S+)\s+(.+?)(?=\s+@|\z)/)
      .map{|k, v| [instance_variable_get(k), v]}
    ]
    

    【讨论】:

    • 谢谢@sawa 你能解释更多关于这个instance_variable_get 方法的信息吗?我得到NoMethodError: undefined method instance_varaible_get' for main:Object`
    • instance_variable_get 将给出的实例变量解释为字符串。例如,如果您在某个上下文中(selffoo),在该上下文中,@bar 被定义为 5,那么 foo.instance_variable_get("@bar") 就是 5
    • @Gaurish Sharma 感谢您纠正我的错字。这很关键。
    • @AndyHarvey 我的回答似乎有一个错字,Gaurish Sharma 对此进行了纠正。请再试一次。
    • 感谢@sawa,这看起来是一个不错的解决方案,但我想我一定是做错了什么。我得到=> {nil=>"consectetur adipisicing"} 作为回复。我的错误是什么?
    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 2016-12-13
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多