我正在尝试遍历一个字符串数组,如果它们与任何替换规则匹配,则替换它们:
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
答案 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
没有密钥subs
则k
返回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
文档。