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


121

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

試したことの実際のコードを表示する必要があります。
アンバー

@琥珀私が試したサンプルを入れました。
JD Isaacks 2012年

回答:


192

'\1'置き換えてみてください(一重引用符が重要です。それ以外の場合は、エスケープする必要があります\)。

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

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

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

68
これは、置換文字列が一重引用符で囲まれている場合にのみ機能することに注意してください。それを理解するのに5分無駄にした。
Vicky Chijwani 2013

7
@MarkThomas-多くの場合、回答全体を読み取らずに、最初に受け入れられた回答を最初に試します。これは一般に、問題を修正する最も効率的な方法のようです。ヴィッキーに休憩を!:)
Josh M.

@VickyChijwani良いコメントが、また、(コマンドラインでのRubyをインラインで使用している場合ことに注意してください-e)、それは可能性が高い確認することです二重引用符をprintf "Punkinhead the name" | ruby -ne 'puts gsub /.*(the name)/, "Jonathans \\1"'に提供する表現があるため-e、通常、単一引用符で囲まれています。
Jonathan Komar 2017

文字列内のパターンのすべての出現に対してこれをどのように行うのですか?
Jagdeep Singh 2017

1
@JagdeepSingh、デフォルトでは、すべての出現箇所を置き換えます。
Iulian Onofrei 2017

36

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

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

または

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

「それが二重引用符で囲まれた文字列である場合、両方の後方参照の前に追加のバックスラッシュを付ける必要があります」と書かれているgsubのドキュメントを参照してください。

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

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

または

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

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



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"


0

$ 変数は、ブロックに一致するようにのみ設定されます。

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

これは、試合でメソッドを呼び出す唯一の方法でもあります。これは一致を変更せず、strip「\ 1」のみを変更します(変更しないでください):

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1".strip)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.