2012-03-27 3 views
80

これを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 } 
+0

あなたはきた何のために実際のコードが表示されるはずです試しました。 – Amber

+0

@Amber試したサンプルを入れました。 –

答えて

138

交換のため'\1'をお試しください:

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

をしかし

は、ここで私がしようとしたものの一例であり、キャプチャグループに興味があるように見えるので、文字列を正規表現でインデックスできます:

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

これは、置換文字列が**一重引用符**内にある場合にのみ機能することに注意してください。私はそれを考え出して5分を無駄にした。 –

+7

@マークトーマス - 答えの全体を読むことなく、最初にトップ/受け入れられた答えを最初に試してみます。それは一般的に問題を解決する最も効率的な方法であるようです。ビッキーに休憩を与える! :) –

+0

@VickyChijwani良いコメントですが、Rubyインライン( '-e'でコマンドライン上で)を使用すると、**二重引用符**:' printf "を見る可能性が高くなります。 ruby -ne 'は '-e'に与えられた式が通常は一重引用符で囲まれているので、gsub /.*(the name)/、" Jonathans \\ 1 "''を入れます。 –

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

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

(?=:)が非キャプチャグループであることを:ようにあなたの試合には現れません。

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

私はそれを行うことができるか分からなかった。ニース! – vreen

1

あなたには、いくつかの結果をフィルタリングするために正規表現を使用して、唯一のキャプチャグループを使用する必要がある場合は、次の操作を行うことができます

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" 
関連する問題