gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:18:11 26 4
gpt4 key购买 nike

是否可以在 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"

显然,这并不像列出的那样工作,我只是把它放在那里作为一个例子来展示我想做什么。我需要根据变量内容的值进行正则表达式匹配。

最佳答案

您认为行不通的代码:

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

如果 var 可以包含正则表达式元字符,事情就会变得更有趣。如果确实如此,并且您希望这些 matacharacters 执行它们通常在正则表达式中执行的操作,那么相同的 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"

关于使用变量名的 Ruby 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2268421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com