Ruby 用捕获的正则表达式模式替换字符串

我没法把这个翻译成 Ruby。

下面是一段 JavaScript 代码,它完全符合我的要求:

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

我试过 Gsub潜艇更换,但似乎都没有达到我预期的效果。

下面是我尝试过的一些方法:

"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 }
128454 次浏览

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

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

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

"foo"[/oo/]
#=> "oo"
"Z_123: foobar"[/^Z_.*(?=:)/]
#=> "Z_123"
def get_code(str)
str.sub(/^(Z_.*): .*/, '\1')
end
get_code('Z_foo: bar!') # => "Z_foo"

双引号中的 \1需要转义

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

或者

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

请参阅 Gsub 的医生,其中写道: “如果是双引号字符串,则两个反引用必须在前面加上一个反斜杠。”

也就是说,如果你只是想要比赛的结果,你可以这样做:

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

或者

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

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

 "foobar".gsub(/(o+)/){|s|s+'ball'}
#=> "fooballbar"

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

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"

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

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

这也是对匹配调用方法的唯一方法。这不会改变比赛,只有 strip“1”(保持不变) :

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