รหัสที่คุณคิดว่าใช้ไม่ได้:
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"