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

用捕获的正则表达式模式替换Ruby字符串,ruby,regex,replace,Ruby,Regex,Replace,我很难把它翻译成Ruby 下面是一段JavaScript,它正是我想要做的: function get_code(str){ return str.replace(/^(Z_.*): .*/,"$1")​​​​​​​​​​​​​​​​​​​​​​​​​​​; } 我试过了,但似乎没有一个能达到我的期望 以下是我尝试过的例子: "Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) { |capture| capture } "Z_sdsd: sdsd".gsub(/^(Z

我很难把它翻译成Ruby

下面是一段JavaScript,它正是我想要做的:

function get_code(str){
    return str.replace(/^(Z_.*): .*/,"$1")​​​​​​​​​​​​​​​​​​​​​​​​​​​;
}
我试过了,但似乎没有一个能达到我的期望

以下是我尝试过的例子:

"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'
替换(单引号很重要,否则需要退出
\
):

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

"foo"[/oo/]
#=> "oo"
"Z_123: foobar"[/^Z_.*(?=:)/]
#=> "Z_123"
def get_代码(str)
str.sub(/^(Z_.*):.*/,'\1')
结束
获取密码(“Z#foo:bar!”)#=>“Z#foo”

双引号中的
\1
需要转义。那么你想要哪一个

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

请参阅其中的说明“如果是双引号字符串,则两个反向引用前面必须加上一个反斜杠。”

也就是说,如果你只想知道比赛结果,你可以:

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


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

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

 "foobar".gsub(/(o+)/){|s|s+'ball'}
 #=> "fooballbar"
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 }" }
这也是对匹配调用方法的唯一方法。这不会更改匹配项,只会删除“\1”(保持不变):


您应该显示您所尝试的实际代码。@Amber我将我所尝试的示例放在这里。请注意,只有当替换字符串在单引号内时,这才有效。“我浪费了5分钟来弄明白这一点。@MarkThomas-通常情况下,我们会先尝试最重要/被接受的答案,而不阅读全部答案。”。这似乎是解决问题最有效的方法。让维琪休息一下!:)@VickyChijwani很好的评论,但也要注意,当使用Ruby内联时(在带有
-e
的命令行上),很可能会看到双引号:
printf“Punkinhead”name“| Ruby-ne”puts gsub/*(name)/,“Jonathans\\1”
,因为提供给
-e
的表达式通常用单引号括起来。@JagdeepSingh,默认情况下,它会替换所有出现的内容。@VickyChijwani当您想使用双引号时,您可以使用
“\\1”
而不是
“\1”
。然后类似于
“Z_123_2018”.gsub(/\A(Z_\d+_)(\d{4})\Z/,“\\1{$2.to_i+1}”)→ “Z_123_2019”
是可能的。我不知道我能做到。美好的
 "foobar".gsub(/(o+)/){|s|s+'ball'}
 #=> "fooballbar"
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 }" }
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1".strip)