Le code que vous pensez ne fonctionne pas:
var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' ) # => "a test foo"
Les choses deviennent plus intéressantes si var peut contenir des méta-caractères d'expression régulière. Si c'est le cas et que vous voulez que ces mata caractères fassent ce qu'ils font habituellement dans une expression régulière, alors le même gsub fonctionnera:
var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"
Cependant, si votre chaîne de recherche contient des métacaractères et que vous ne voulez pas qu'ils soient interprétés comme des métacaractères, utilisez Regexp.escape comme ceci:
var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"
Ou donnez simplement à gsub une chaîne au lieu d'une expression régulière. Dans MRI> = 1.8.7, gsub traitera un argument de remplacement de chaîne comme une chaîne simple et non comme une expression régulière:
var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"
(Auparavant, un argument de remplacement de chaîne dans gsub était automatiquement converti en une expression régulière. Je sais que c'était ainsi dans 1.6. Je ne me souviens pas quelle version a introduit le changement).
Comme indiqué dans d'autres réponses, vous pouvez utiliser Regexp.new comme alternative à l'interpolation:
var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"
Cela fonctionne, mais vous devez utiliser
gsub!
ou affecter le retour à une autre variablela source
Oui
la source
Vous pouvez utiliser des expressions régulières via des variables dans ruby:
la source
var
variable et dans le premier paramètre de gsub.la source
Regexp
Regexp
ruby-doc.org/core-2.7.0/Regexp.html