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

时间:2012-03-27 22:10:45

标签: ruby regex replace

我无法将其转换为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 }

6 个答案:

答案 0 :(得分:170)

尝试使用'\1'进行替换(单引号非常重要,否则您需要转义\):

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

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

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

答案 1 :(得分:34)

双引号中的

\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_.*(?=:)/]

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

答案 2 :(得分:11)

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

答案 3 :(得分: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"

答案 4 :(得分:1)

def get_code(str)
  str.sub(/^(Z_.*): .*/, '\1')
end
get_code('Z_foo: bar!') # => "Z_foo"

答案 5 :(得分:0)

$变量仅设置为与块中的匹配项:

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

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

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