您认为不起作用的代码确实有效:
var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' ) # => "a test foo"
如果 var 可以包含正则表达式元字符,事情会变得更有趣。如果确实如此,并且您希望这些元字符执行它们通常在正则表达式中执行的操作,那么相同的 gsub 将起作用:
var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"
但是,如果您的搜索字符串包含元字符并且您这样做not希望它们被解释为元字符,然后使用 Regexp.escape 如下所示:
var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"
或者只是给 gsub 一个字符串而不是正则表达式。在 MRI >= 1.8.7 中,gsub 会将字符串替换参数视为普通字符串,而不是正则表达式:
var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"
(过去,gsub 的字符串替换参数会自动转换为正则表达式。我知道 1.6 中就是这样。我不记得是哪个版本引入了更改)。
正如其他答案中所述,您可以使用 Regexp.new 作为插值的替代方法:
var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"