Ruby正则表达式使用变量名


105

是否可以基于变量名称的值在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"

显然,这不能按所列方式工作,我仅将其作为示例说明我想做什么。我需要根据变量内容的值进行正则表达式匹配。

Answers:


184

您认为无效的代码可以:

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"

4
Regexp.escape的提示正是我所不知道的。谢谢!
Jeff Paquette

regxPlayerVariable ='(。*?)=。*?document \ .getElementById(#{pluginPlayeVariable})'在上面我都应用了,但这些都不起作用。
SSP 2014年

1
@SSP最好在一个单独的问题中解释问题。
韦恩·康拉德

13

它有效,但是您需要使用gsub!返回值或将其分配给另一个变量

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


6

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

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

1
我不知道为什么这只能投票。我试过了,即使您在var变量和gsub的第一个参数中都不需要正则表达式斜杠,它也可以工作。
泰勒·科利尔

我认为gsub中的斜杠是为了表明正则表达式可以包含一个变量,该变量本身就是一个正则表达式。变量不必是字符串类型(事实上,由于Wayne的回答中列出的原因,正则表达式更好)。
mahemoff

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.