Код, який, на вашу думку, не працює, робить:
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"