web-dev-qa-db-ja.com

Ruby文字列をキャプチャされた正規表現パターンに置き換えます

これをRubyに翻訳するのに問題があります。

以下は、私がやりたいことを正確に行うJavaScriptの一部です。

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

gsubsub 、および 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 }
110
JD Isaacks

代わりに'\1'を試してください(単一引用符が重要です。そうでない場合は、\をエスケープする必要があります):

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

ただし、キャプチャグループにのみ関心があるように見えるため、正規表現を使用して文字列にインデックスを付けることができることに注意してください。

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

二重引用符で囲まれた\1はエスケープする必要があります。だからあなたはどちらかが欲しい

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

または

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

gsubのドキュメント を参照してください。「二重引用符で囲まれた文字列の場合、両方の後方参照の前に追加の円記号が必要です。」

そうは言っても、試合の結果だけが必要な場合は、次のようにします。

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

または

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

(?=:)は非キャプチャグループであるため、:は対戦に表示されないことに注意してください。

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

正規表現を使用して一部の結果をフィルタリングする必要があり、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"
4
grumpit
def get_code(str)
  str.sub(/^(Z_.*): .*/, '\1')
end
get_code('Z_foo: bar!') # => "Z_foo"
1
maerics