如何遍历散列和数组并替换字符串中的单词

时间:2016-12-08 23:35:13

标签: arrays ruby hash iterator

我正在尝试遍历一个字符串数组,如果它们与任何替换规则匹配,则替换它们:

array= ["I love chicken!", "I love lamb!", "I love beef!"]
substitutions = {
"love" => "hate",
"lamb" => "turkey"
}

我想迭代数组并检查与替换哈希中的键匹配的任何单词。然后该数组将成为:

array= ["I hate chicken!", "I hate turkey!", "I hate beef!"]

这是我到目前为止所做的:

array.each do |strings|
strings = strings.split
    strings.each do |word|
        substitutions.each do |phrase,substitute|
            if word == phrase
                word = substitute
                return word
            end
        end
    end
end

3 个答案:

答案 0 :(得分:2)

这将为您提供所需的结果。正如您所看到的,您过度复杂了

arry= ["I love chicken!", "I love lamb!", "I love beef!"]
substitutions = { "love" => "hate", "lamb" => "turkey" }

arry.each_with_index do |str,ind|
  substitutions.each_key do |word|
    arry[ind].gsub!(word,substitutions[word]) if str.include?(word)
  end
end

puts arry

这会给你:

[ "I hate chicken!", "I hate turkey!", "I hate beef!" ]

你分割句子的策略是行不通的。惊叹号会造成一些麻烦。在这种情况下,使用#include?进行测试的想法要好得多。

注意使用gsub!(带!),它将在原始数组中进行更改。

答案 1 :(得分:1)

arr  = ["I love chicken!", "I love lamb!", "I love beef!"]
subs = { "love"=>"hate", "lamb"=>"turkey" }

subs.default_proc = ->(h,k) { k }
  #=> #<Proc:0x007f9ff0a014b8@(irb):1343 (lambda)>
arr.map { |s| s.gsub(/\w+/, subs) }
  #=> ["I hate chicken!", "I hate turkey!", "I hate beef!"]

我使用Hash#default_proc=将proc附加到subs,以便subs[k]如果k没有密钥subsk返回class SizeVariationForm(Form): name = TextField("name") sku = TextField("SKU Number") class AddVariationForm(NewListingForm): item_list = FieldList(FormField(SizeVariationForm)) add_field = SubmitField('Add Variations') FileField('Main image 1') @app.route('/index', methods=['GET', 'POST']) def add_inputs(): form = AddVariationForm(request.form) if form.add_field.data: new_variation = form.item_list.append_entry() return render_template('index.html',form=form) 使用String#gsub的形式,使用哈希进行替换。

答案 2 :(得分:0)

根本没有必要迭代哈希。而是使用它来生成正则表达式并将其传递给gsub。这就是我多次这样做的方式;它是模板引擎的基础:

array = ["I love chicken!", "I love lamb!", "I love beef!"]
substitutions = {
  "love" => "hate",
  "lamb" => "turkey"
}

key_regex = /\b(?:#{Regexp.union(substitutions.keys).source})\b/
# => /\b(?:love|lamb)\b/

array.map! { |s|
  s.gsub(key_regex, substitutions)
}

array # => ["I hate chicken!", "I hate turkey!", "I hate beef!"]

如果您不希望使用array使用map的内容,则会返回一个新的数组,原来保持不变:

array.map { |s|
  s.gsub(key_regex, substitutions)
}
# => ["I hate chicken!", "I hate turkey!", "I hate beef!"]

array # => ["I love chicken!", "I love lamb!", "I love beef!"]

诀窍是定义用于查找关键词的正则表达式。

有关详细信息,请参阅“How to build a case-insensitive regular expression with Regexp.union”以及gsub文档。