查找并替换仅匹配的第一个结果

时间:2015-06-05 01:42:18

标签: ruby-on-rails ruby regex ruby-on-rails-4

我已经编写了一个方法来查找和替换更大字符串中的字符串,如下所示:

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."

它仅替换电话号码而不是电子邮件地址。我做错了什么?

2 个答案:

答案 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." 

如果您想在散列中添加额外的键值对,后者会更灵活一些。