【问题标题】:Ruby replace string with captured regex patternRuby 用捕获的正则表达式模式替换字符串
【发布时间】:2012-04-11 12:15:59
【问题描述】:

我无法将其翻译成 Ruby。

这是一段完全符合我要求的 JavaScript:

function get_code(str){
    return str.replace(/^(Z_.*): .*/,"$1")​​​​​​​​​​​​​​​​​​​​​​​​​​​;
}

我尝试过gsubsubreplace,但似乎没有一个能达到我的预期。

以下是我尝试过的示例:

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) { |capture| capture }
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "$1")
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "#{$1}")
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\1")
"Z_sdsd: sdsd".gsub(/(.).*/) { |capture| capture }

【问题讨论】:

  • 您应该显示您尝试过的实际代码。
  • @Amber 我放了我试过的样本。

标签: ruby regex replace


【解决方案1】:

尝试'\1' 替换(单引号很重要,否则您需要转义\):

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

但由于您似乎只对捕获组感兴趣,请注意您可以使用正则表达式对字符串进行索引:

"foo"[/oo/]
#=> "oo"
"Z_123: foobar"[/^Z_.*(?=:)/]
#=> "Z_123"

【讨论】:

  • 请注意,这仅适用于替换字符串在 单引号内的情况。我浪费了 5 分钟才弄清楚。
  • @MarkThomas - 通常我们会在没有阅读全部答案的情况下先尝试最热门/接受的答案。这似乎通常是解决问题的最有效方法。让维姬休息一下! :)
  • @VickyChijwani 不错的评论,但还要注意,当使用 Ruby 内联时(在带有-e 的命令行上),更有可能看到双引号:@987654326 @ 因为提供给-e 的表达式通常用单引号括起来。
  • @JagdeepSingh,默认情况下,它会替换所有出现的地方。
  • @VickyChijwani 当你想使用双引号时,你可以写"\\1" 而不是'\1'。然后像"Z_123_2018".gsub(/\A(Z_\d+_)(\d{4})\z/, "\\1#{$2.to_i+1}") → "Z_123_2019" 这样的东西是可能的。
【解决方案2】:

双引号中的\1 需要转义。所以你想要

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

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

请参阅the docs on gsub,它说“如果它是双引号字符串,则两个反向引用必须在前面加上一个额外的反斜杠。”

话虽如此,如果你只想要比赛的结果,你可以这样做:

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

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

请注意,(?=:) 是非捕获组,因此 : 不会出现在您的匹配中。

【讨论】:

    【解决方案3】:
     "foobar".gsub(/(o+)/){|s|s+'ball'}
     #=> "fooballbar"
    

    【讨论】:

    • 不知道我能做到。不错!
    • 那个块很方便!
    【解决方案4】:

    如果您需要使用正则表达式过滤某些结果,然后只使用捕获组,您可以执行以下操作:

    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"
    

    【讨论】:

      【解决方案5】:
      def get_code(str)
        str.sub(/^(Z_.*): .*/, '\1')
      end
      get_code('Z_foo: bar!') # => "Z_foo"
      

      【讨论】:

        【解决方案6】:

        $ 变量只设置为匹配到块中:

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

        这也是在比赛中调用方法的唯一方式。这不会改变匹配,只有strip "\1" (保持不变):

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-30
          • 2018-07-13
          • 1970-01-01
          相关资源
          最近更新 更多