哈希字符串中的子词(和短语)

时间:2016-03-22 01:30:52

标签: ruby regex

我正在寻找一种从哈希中替换字符串中的单词和短语的方法。我知道这可以在Ruby中优雅地完成> 1.9为单词

a = "every good boy does fine"
h = {"every" => "all","boy" => "girl", "fine" =>"well" }
a.gsub(/\w+/) { |m| h.fetch(m,m)}

https://stackoverflow.com/a/20650800/4530434

但是,如果我想要替换的短语不止一个单词,那么这不起作用。 我想要的是这样的,理想情况下使用任意长的字符串替换,但我会选择两个(或三个)单词短语。

a = "I love the eighteen nineties"
b = {"eighteen nineties" => "1890's" }
# => "I love the 1890's"

我在上面的代码中尝试过使用Regexp,但是无法工作。

3 个答案:

答案 0 :(得分:1)

尝试遍历散列中的每个值:

>> a = "I love the eighteen nineties"
>> b = {"eighteen nineties" => "1890's", "love" => "enjoy" }

>> b.inject(a) {|s, (k, v)| s.gsub(k, v)}
=> "I enjoy the 1890's"

答案 1 :(得分:1)

根据映射制作模式:

onBackPressed

答案 2 :(得分:0)

这是你的想法吗?请注意gsub!具有破坏性,并将永久替换a中的字符串。这循环遍历每个散列键,并且在a中找到散列键的位置,它将用存储在相对于键的散列中的值替换它。

irb(main):001:0> a = "I love the eighteen nineties"
=> "I love the eighteen nineties"
irb(main):002:0> b = {"eighteen nineties" => "1890's" }
=> {"eighteen nineties"=>"1890's"}
irb(main):003:0> b.keys.each { |k| a.gsub!(k, b[k]) }
=> ["eighteen nineties"]
irb(main):004:0> a
=> "I love the 1890's"