使用变量名的 Ruby 正则表达式

是否可以在 Ruby 中创建/使用基于变量名称值的正则表达式模式?

例如,我们都知道我们可以对 Ruby 字符串执行以下操作:

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

我想对正则表达式做同样的事情:

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

显然,这并不像列出的那样起作用,我只是把它作为一个例子来展示我想要做的事情。我需要根据变量内容的值进行 regexp 匹配。

88021 次浏览

它可以工作,但是需要使用 gsub!或将返回值分配给另一个变量

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

可以通过 Ruby 中的变量使用正则表达式:

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

是的


str.gsub Regexp.new(var), 'foo'

你认为不起作用的代码起作用了:

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

如果 var 可以包含正则表达式元字符,那么事情就会变得更有趣。如果是这样,你想让这些匹配字符做它们在正则表达式中通常做的事情,那么同样的 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"

(It used to be that a string replacement argument to gsub was automatically converted to a regular expression. I know it was that way in 1.6. I don't recall which version introduced the change).

正如其他答案中提到的,您可以使用 Regexp.new 作为插值的替代方法:

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