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

JD *_*cks 112 ruby regex replace

我无法将其转换为Ruby.

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

function get_code(str){
    return str.replace(/^(Z_.*): .*/,"$1")???????????????????????????;
}
Run Code Online (Sandbox Code Playgroud)

我尝试过gsub,subreplace,但似乎没有人做我期待的事情.

以下是我尝试过的例子:

"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 }
Run Code Online (Sandbox Code Playgroud)

Mic*_*ohl 179

尝试'\1'更换(单引号很重要,否则你需要逃避\):

"foo".gsub(/(o+)/, '\1\1\1')
#=> "foooooo"
Run Code Online (Sandbox Code Playgroud)

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

"foo"[/oo/]
#=> "oo"
"Z_123: foobar"[/^Z_.*(?=:)/]
#=> "Z_123"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅在替换字符串在**单引号**内时才有效.我浪费了5分钟搞清楚. (67认同)
  • @MarkThomas - 我们经常在没有阅读完整答案的情况下首先尝试顶部/接受的答案.这通常是解决问题的最有效方法.让Vicky休息一下!:) (7认同)
  • @VickyChijwani 当您想使用双引号时,您可以写入 `"\\1"` 而不是 `'\1'`。然后像`"Z_123_2018".gsub(/\A(Z_\d+_)(\d{4})\z/, "\\1#{$2.to_i+1}") → "Z_123_2019"`是可能的。 (2认同)

Mar*_*mas 36

\1在双引号中需要转义.你也想要

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1")
Run Code Online (Sandbox Code Playgroud)

要么

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, '\1')
Run Code Online (Sandbox Code Playgroud)

请参阅gsub的文档,其中显示"如果它是双引号字符串,则两个反向引用都必须以额外的反斜杠开头."

话虽这么说,如果你只想要匹配的结果,你可以做:

"Z_sdsd: sdsd".scan(/^Z_.*(?=:)/)
Run Code Online (Sandbox Code Playgroud)

要么

"Z_sdsd: sdsd"[/^Z_.*(?=:)/]
Run Code Online (Sandbox Code Playgroud)

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


gau*_*roy 11

 "foobar".gsub(/(o+)/){|s|s+'ball'}
 #=> "fooballbar"
Run Code Online (Sandbox Code Playgroud)

  • 不知道我能做到这一点.太好了! (4认同)

gru*_*pit 5

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

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"
Run Code Online (Sandbox Code Playgroud)