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' )