Ruby replace string with captured regex pattern

后端 未结 6 1918
庸人自扰
庸人自扰 2021-01-31 13:13

I am having trouble translating this into Ruby.

Here is a piece of JavaScript that does exactly what I want to do:

function get_code(str){
    return str         


        
相关标签:
6条回答
  • 2021-01-31 13:25

    \1 in double quotes needs to be escaped. So you want either

    "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1")
    

    or

    "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, '\1')
    

    see the docs on gsub where it says "If it is a double-quoted string, both back-references must be preceded by an additional backslash."

    That being said, if you just want the result of the match you can do:

    "Z_sdsd: sdsd".scan(/^Z_.*(?=:)/)
    

    or

    "Z_sdsd: sdsd"[/^Z_.*(?=:)/]
    

    Note that the (?=:) is a non-capturing group so that the : doesn't show up in your match.

    0 讨论(0)
  • 2021-01-31 13:36
    def get_code(str)
      str.sub(/^(Z_.*): .*/, '\1')
    end
    get_code('Z_foo: bar!') # => "Z_foo"
    
    0 讨论(0)
  • 2021-01-31 13:37

    Try '\1' for the replacement (single quotes are important, otherwise you need to escape the \):

    "foo".gsub(/(o+)/, '\1\1\1')
    #=> "foooooo"
    

    But since you only seem to be interested in the capture group, note that you can index a string with a regex:

    "foo"[/oo/]
    #=> "oo"
    "Z_123: foobar"[/^Z_.*(?=:)/]
    #=> "Z_123"
    
    0 讨论(0)
  • 2021-01-31 13:38
     "foobar".gsub(/(o+)/){|s|s+'ball'}
     #=> "fooballbar"
    
    0 讨论(0)
  • 2021-01-31 13:49

    If you need to use a regex to filter some results, and THEN use only the capture group, you can do the following:

    str = "Leesburg, Virginia  20176"
    state_regex = Regexp.new(/,\s*([A-Za-z]{2,})\s*\d{5,}/)
    # looks for the comma, possible whitespace, captures alpha,
    # looks for possible whitespace, looks for zip
    
    > str[state_regex]
    => ", Virginia  20176"
    
    > str[state_regex, 1] # use the capture group
    => "Virginia"
    
    0 讨论(0)
  • 2021-01-31 13:49

    $ variables are only set to matches into the block:

    "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) { "#{ $1.strip }" }
    

    This is also the only way to call a method on the match. This will not change the match, only strip "\1" (leaving it unchanged):

    "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1".strip)
    
    0 讨论(0)
提交回复
热议问题