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

cpj*_*eur 96 ruby regex

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

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

str = "my string"
str2 = "This is #{str}" # => "This is my string"
Run Code Online (Sandbox Code Playgroud)

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

var = "Value"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "a test foo"
Run Code Online (Sandbox Code Playgroud)

显然,这不是列出的工作,我只是把它作为一个例子,以显示我想做的事情.我需要根据变量内容的值进行regexp匹配.

Way*_*rad 173

您认为不起作用的代码是:

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

如果var可以包含正则表达式元字符,事情会变得更有趣.如果确实如此,并且您希望这些matacharacters执行他们通常在正则表达式中执行的操作,那么相同的gsub将起作用:

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

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

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

或者只是给gsub一个字符串而不是正则表达式.在MRI> = 1.8.7中,gsub会将字符串替换参数视为普通字符串,而不是正则表达式:

var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"
Run Code Online (Sandbox Code Playgroud)

(过去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"
Run Code Online (Sandbox Code Playgroud)

  • 关于Regexp.escape的提示正是我不知道我需要的.谢谢! (4认同)

FMc*_*FMc 13

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

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


Dig*_*oss 9


str.gsub Regexp.new(var), 'foo'
Run Code Online (Sandbox Code Playgroud)


Gee*_*tra 6

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

var = /Value/
str = "a test Value"
str.gsub( /#{var}/, 'foo' )
Run Code Online (Sandbox Code Playgroud)