変数名を使用したRuby正規表現


105

変数名の値に基づいたルビで正規表現パターンを作成/使用することは可能ですか?

たとえば、Ruby文字列を使用して次のことができることは誰もが知っています。

str = "my string"
str2 = "This is #{str}" # => "This is my string"

正規表現で同じことをしたいのですが。

var = "Value"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "a test foo"

リストにあるように動作しないことは明らかですが、ここでは例として、私が何をしたいかを示しています。変数の内容の値に基づいて一致を正規表現する必要があります。

回答:


184

あなたが思うコードは機能しません、しません:

var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' )   # => "a test foo"

varに正規表現のメタ文字を含めることができれば、さらに興味深いものになります。それが可能で、それらのマタ文字が通常の正規表現で通常行うことを実行したい場合、同じgsubが機能します。

var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"

ただし、検索文字列にメタ文字が含まれていて、メタ文字として解釈さたくない場合は、次のようにRegexp.escapeを使用します。

var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"

または、正規表現の代わりにgsubに文字列を与えるだけです。MRI> = 1.8.7では、gsubは文字列置換引数を正規表現ではなくプレーン文字列として扱います。

var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"

(以前はgsubへの文字列置換引数が自動的に正規表現に変換されていました。私はそれが1.6でそうだったことを知っています。どのバージョンが変更を導入したか覚えていません)。

他の回答で述べたように、Regexp.newを補間の代わりとして使用できます。

var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"

4
Regexp.escapeのヒントは、自分が必要としていることを知らなかったものです。ありがとう!
Jeff Paquette

regxPlayerVariable = '(。*?)=。*?document \ .getElementById(#{pluginPlayeVariable})'これに上記をすべて適用しましたが、これらは機能しません。
SSP

1
@SSP別の質問で問題を説明するとよいでしょう。
ウェインコンラッド

13

動作しますがgsub!、リターンを使用するか、別の変数に割り当てる必要があります

var = "Value"
str = "a test Value"
str.gsub!( /#{var}/, 'foo' )  # Or this: new_str = str.gsub( /#{var}/, 'foo' )
puts str


6

Rubyの変数を介して正規表現を使用できます。

var = /Value/
str = "a test Value"
str.gsub( /#{var}/, 'foo' )

1
なぜこれが反対票しかないのかわかりません。var変数とgsubの最初のパラメーターの両方に正規表現のスラッシュは必要ありませんが、試してみましたが、うまくいきました。
タイラーコリアー2016年

gsubのスラッシュのポイントは、正規表現がそれ自体正規表現である変数を含むことができることを示すことであったと思います。変数は文字列型である必要はありません(実際、ウェインの回答で概説されている理由により、正規表現の方が適しています)。
mahemoff

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.