Ruby用捕获的正则expression式模式replacestring

我无法将其翻译成Ruby。

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

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

我已经尝试过gsub , sub和replace,但似乎没有做我所期望的。

以下是我尝试过的一些例子:

 "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 } 

尝试'\1'的replace( 单引号是重要的,否则你需要转义\ ):

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

但是由于您似乎只对捕获组感兴趣,请注意您可以使用正则expression式对string进行索引:

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

\1双引号需要逃脱。 所以你要么

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

要么

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

请参阅gsub上的文档,其中指出:“如果是双引号string,则两个后引用必须前面加上一个反斜杠。”

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

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

要么

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

请注意, (?=:)是一个非捕获组,所以:在您的匹配中不显示。

  "foobar".gsub(/(o+)/){|s|s+'ball'} #=> "fooballbar" 
 def get_code(str) str.sub(/^(Z_.*): .*/, '\1') end get_code('Z_foo: bar!') # => "Z_foo" 

如果您需要使用正则expression式来过滤一些结果,那么只使用捕获组,您可以执行以下操作:

 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"