Der Code, von dem Sie denken, dass er nicht funktioniert, funktioniert:
var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' ) # => "a test foo"
Interessanter wird es, wenn var Metazeichen mit regulären Ausdrücken enthalten kann. Wenn dies der Fall ist und Sie möchten, dass diese Matacharzeichen das tun, was sie normalerweise in einem regulären Ausdruck tun, funktioniert dasselbe gsub:
var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"
Wenn Ihre Suchzeichenfolge jedoch Metazeichen enthält und Sie nicht möchten, dass sie als Metazeichen interpretiert werden, verwenden Sie Regexp.escape wie folgt:
var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"
Oder geben Sie gsub einfach einen String anstelle eines regulären Ausdrucks. In MRI> = 1.8.7 behandelt gsub ein Argument zum Ersetzen von Zeichenfolgen als einfache Zeichenfolge und nicht als regulären Ausdruck:
var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"
(Früher wurde ein String-Ersetzungsargument für gsub automatisch in einen regulären Ausdruck konvertiert. Ich weiß, dass dies in 1.6 so war. Ich kann mich nicht erinnern, welche Version die Änderung eingeführt hat.)
Wie in anderen Antworten erwähnt, können Sie Regexp.new als Alternative zur Interpolation verwenden:
var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"
Es funktioniert, aber Sie müssen
gsub!
die Rückgabe verwenden oder einer anderen Variablen zuweisenquelle
Ja
quelle
Sie können reguläre Ausdrücke durch Variablen in Ruby verwenden:
quelle
var
Variablen als auch im ersten Parameter von gsub nicht benötigen .quelle
Regexp
Regexp
ruby-doc.org/core-2.7.0/Regexp.html