Ruby使用variables名称的正则expression式

是可以创build/使用正则expression式模式的ruby,基于variables名的值?

例如,我们都知道我们可以用Rubystring来做以下事情:

str = "my string" str2 = "This is #{str}" # => "This is my string" 

我想用正则expression式做同样的事情:

 var = "Value" str = "a test Value" str.gsub( /#{var}/, 'foo' ) # => "a test foo" 

显然,这并不像上市,我只是把它作为一个例子来表明我想要做什么。 我需要根据variables内容的值进行正则expression式匹配。

您认为的代码不起作用,会:

 var = "Value" str = "a test Value" p str.gsub( /#{var}/, 'foo' ) # => "a test foo" 

如果var可以包含正则expression式元字符,事情会变得更有趣。 如果是这样,你希望这些matacharacters在正则expression式中做他们通常做的事情,那么相同的gsub将会工作:

 var = "Value|a|test" str = "a test Value" str.gsub( /#{var}/, 'foo' ) # => "foo foo foo" 

但是,如果您的searchstring包含元字符,并且您希望它们被解释为元字符,那么请使用Regexp.escape,如下所示:

 var = "*This*" str = "*This* is a string" p str.gsub( /#{Regexp.escape(var)}/, 'foo' ) # => "foo is a string" 

或者给gsub一个string而不是一个正则expression式。 在MRI> = 1.8.7中,gsub将把一个stringreplace参数视为一个普通的string,而不是正则expression式:

 var = "*This*" str = "*This* is a string" p str.gsub(var, 'foo' ) # => "foo is a string" 

(曾经是gsub的stringreplace参数被自动转换为正则expression式,我知道这是1.6版的,我不记得哪个版本引入了这个改变)。

正如在其他答案中指出的,你可以使用Regexp.new作为插值的替代方法:

 var = "*This*" str = "*This* is a string" p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' ) # => "foo is a string" 

它的工作原理,但你需要使用gsub! 或将返回值分配给另一个variables

 var = "Value" str = "a test Value" str.gsub!( /#{var}/, 'foo' ) # Or this: new_str = str.gsub( /#{var}/, 'foo' ) puts str 


 str.gsub Regexp.new(var), 'foo' 
 str.gsub( Regex.new("#{var}"), 'foo' ) 

你可以在Ruby中通过variables使用正则expression式:

 var = /Value/ str = "a test Value" str.gsub( /#{var}/, 'foo' )