我已经编写了一个方法来查找和替换更大字符串中的字符串,如下所示:
def user_gsubbed_text
text.include?('##')
var = text.match(/##\w+/).to_s.tr('##', '')
text.gsub!(var, document.user.send(var.to_sym)).tr('##', '')
else
text
end
end
如果##phone
在字符串中,它将被替换为用户的电话号码。它在第一种意义上工作正常,但给出了这样的字符串:
"Call me on ##phone or email me at ##email."
它仅替换电话号码而不是电子邮件地址。我做错了什么?
答案 0 :(得分:3)
你没有任何循环。您的代码只是找到第一个##foo
,然后提取变量名称,然后全局替换该变量。其他#bar
根本没有被触及。
简单的方法是使用gsub!
:
def user_gsubbed_text(text)
text.gsub!(/##(\w+)/) do |match|
document.user.send($1.to_sym)
end
end
答案 1 :(得分:2)
如果我正确理解了这个问题,您可以使用带有哈希的String#gsub:
h = { "##phone"=>"123-456-7899", "##email"=>"me@yahoo.com" }
str = "Call me on ##phone or email me at ##email."
str.gsub(/\#\#\w+/, h)
#=> "Call me on 123-456-7899 or email me at me@yahoo.com."
或:
h.default_proc = proc { |h,k| k }
str.gsub(/\S+/, h)
#=> "Call me on 123-456-7899 or email me at me@yahoo.com."
如果您想在散列中添加额外的键值对,后者会更灵活一些。