Kode yang menurut Anda tidak berfungsi, berfungsi:
var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' ) # => "a test foo"
Hal-hal menjadi lebih menarik jika var dapat berisi meta-karakter ekspresi reguler. Jika ya dan Anda ingin karakter matakarakter tersebut melakukan apa yang biasanya mereka lakukan dalam ekspresi reguler, maka gsub yang sama akan berfungsi:
var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"
Namun, jika string pencarian Anda berisi karakter meta dan Anda tidak ingin ditafsirkan sebagai karakter meta, gunakan Regexp.escape seperti ini:
var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"
Atau berikan saja gsub string sebagai ganti ekspresi reguler. Dalam MRI> = 1.8.7, gsub akan memperlakukan argumen penggantian string sebagai string biasa, bukan ekspresi reguler:
var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"
(Dulu argumen penggantian string ke gsub secara otomatis diubah menjadi ekspresi reguler. Saya tahu itu seperti itu di 1.6. Saya tidak ingat versi mana yang memperkenalkan perubahan).
Seperti disebutkan dalam jawaban lain, Anda dapat menggunakan Regexp.new sebagai alternatif interpolasi:
var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"
Ini berfungsi, tetapi Anda perlu menggunakan
gsub!
atau menetapkan pengembalian ke variabel lainsumber
Iya
sumber
Anda dapat menggunakan ekspresi reguler melalui variabel di ruby:
sumber
var
parameter pertama variabel dan gsub.sumber
Regexp
Regexp
ruby-doc.org/core-2.7.0/Regexp.html