【问题标题】:Ruby regular expression using variable name使用变量名的 Ruby 正则表达式
【发布时间】:2011-01-17 03:02:35
【问题描述】:

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

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

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    你认为行不通的代码,行:

    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"
    

    (以前是 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"
    

    【讨论】:

    • Regexp.escape 上的提示正是我不知道我需要的。谢谢!
    • regxPlayerVariable = '(.*?)=.*?document\.getElementById(#{pluginPlayeVariable})' 我在上面应用了所有这些,但这些都不起作用。
    • @SSP 在单独的问题中解释问题可能会很好。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      是的


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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 我不知道为什么这只会有反对票。我试过了,它可以工作,即使你在 var 变量和 gsub 的第一个参数中都不需要正则表达式斜杠。
        • 我认为 gsub 中斜线的意义在于表明正则表达式可以包含一个本身就是正则表达式的变量。该变量不必是字符串类型(事实上,由于韦恩的回答中概述的原因,正则表达式更好)。
        【解决方案5】:
        str.gsub( Regexp.new("#{var}"), 'foo' )
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-28
        • 2014-01-27
        • 1970-01-01
        相关资源
        最近更新 更多