Ruby regular expression using variable name

后端 未结 5 1595
难免孤独
难免孤独 2020-11-28 04:08

Is is possible to create/use a regular expression pattern in ruby that is based on the value of a variable name?

For instance, we all know we can do the following wi

相关标签:
5条回答
  • 2020-11-28 04:46

    It works, but you need to use gsub! or assign the return to another variable

    var = "Value"
    str = "a test Value"
    str.gsub!( /#{var}/, 'foo' )  # Or this: new_str = str.gsub( /#{var}/, 'foo' )
    puts str
    
    0 讨论(0)
  • 2020-11-28 04:54

    You can use regular expressions through variables in ruby:

    var = /Value/
    str = "a test Value"
    str.gsub( /#{var}/, 'foo' )
    
    0 讨论(0)
  • 2020-11-28 05:03

    The code you think doesn't work, does:

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

    Things get more interesting if var can contain regular expression meta-characters. If it does and you want those matacharacters to do what they usually do in a regular expression, then the same gsub will work:

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

    However, if your search string contains metacharacters and you do not want them interpreted as metacharacters, then use Regexp.escape like this:

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

    Or just give gsub a string instead of a regular expression. In MRI >= 1.8.7, gsub will treat a string replacement argument as a plain string, not a regular expression:

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

    As noted in other answers, you can use Regexp.new as an alternative to interpolation:

    var = "*This*"
    str = "*This* is a string"
    p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
    # => "foo is a string"
    
    0 讨论(0)
  • 2020-11-28 05:03

    Yes


    str.gsub Regexp.new(var), 'foo'
    
    0 讨论(0)
  • 2020-11-28 05:03
    str.gsub( Regexp.new("#{var}"), 'foo' )
    
    0 讨论(0)
提交回复
热议问题