Expression régulière Ruby utilisant le nom de la variable

Est-il possible de créer / utiliser un modèle d’expression régulière dans ruby ​​basé sur la valeur d’un nom de variable?

Par exemple, nous soaps tous que nous pouvons faire ce qui suit avec des chaînes Ruby:

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

Je voudrais faire la même chose avec des expressions régulières:

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

De toute évidence, cela ne fonctionne pas comme indiqué, je ne le présente que comme exemple pour montrer ce que je voudrais faire. J’ai besoin d’exprimer une correspondance basée sur la valeur du contenu d’une variable.

Le code que vous pensez ne fonctionne pas, fait:

 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 personnages fassent ce qu’ils font habituellement dans une expression régulière, alors le même fichier 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 souhaitez pas les interpréter comme des métacaractères, utilisez Regexp.escape comme ceci:

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

Ou donnez simplement une chaîne à gsub 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 de caractères ordinaire, et non comme une expression régulière:

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

(Auparavant, un argument de remplacement de chaîne de caractères pour gsub était automatiquement converti en une expression régulière. Je sais que c’était comme cela en 1.6. Je ne me souviens plus 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 ssortingng" p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' ) # => "foo is a ssortingng" 

Cela fonctionne, mais vous devez utiliser gsub! ou atsortingbuer le retour à une autre variable

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

Oui


 str.gsub Regexp.new(var), 'foo' 
 str.gsub( Regex.new("#{var}"), 'foo' ) 

Vous pouvez utiliser des expressions régulières via des variables dans ruby:

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