Mã bạn nghĩ không hoạt động, không:
var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' ) # => "a test foo"
Mọi thứ trở nên thú vị hơn nếu var có thể chứa các ký tự meta biểu thức chính quy. Nếu đúng như vậy và bạn muốn các ký tự matacharacter đó làm những gì họ thường làm trong một biểu thức chính quy, thì gsub tương tự sẽ hoạt động:
var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"
Tuy nhiên, nếu chuỗi tìm kiếm của bạn chứa siêu ký tự và bạn không muốn chúng được hiểu là siêu ký tự, thì hãy sử dụng Regexp.escape như sau:
var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"
Hoặc chỉ cung cấp cho gsub một chuỗi thay vì một biểu thức chính quy. Trong MRI> = 1.8.7, gsub sẽ coi đối số thay thế chuỗi là một chuỗi thuần túy, không phải là một biểu thức chính quy:
var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"
(Trước đây, một đối số thay thế chuỗi thành gsub đã được tự động chuyển đổi thành một biểu thức chính quy. Tôi biết nó là như vậy trong phiên bản 1.6. Tôi không nhớ phiên bản nào đã giới thiệu thay đổi).
Như đã lưu ý trong các câu trả lời khác, bạn có thể sử dụng Regexp.new thay thế cho phép nội suy:
var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"