Ответ 1
Код, который, по вашему мнению, не работает, делает:
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"
Однако, если ваша строка поиска содержит метасимволы, и вы не хотите, чтобы они интерпретировались как метасимволы, тогда используйте 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"