Answers:
您认为无效的代码可以:
var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' ) # => "a test foo"
如果var可以包含正则表达式元字符,则事情会变得更加有趣。如果这样做,并且您希望这些matacharacter像平常一样执行正则表达式中的工作,则相同的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"
str.gsub( Regex.new("#{var}"), 'foo' )
Regexp
Regexp
ruby-doc.org/core-2.7.0/Regexp.html