작동하지 않는다고 생각하는 코드는 다음을 수행합니다.
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"