Ruby regulärer Ausdruck unter Verwendung des Variablennamens

105

Ist es möglich, ein reguläres Ausdrucksmuster in Ruby zu erstellen / zu verwenden, das auf dem Wert eines Variablennamens basiert?

Zum Beispiel wissen wir alle, dass wir mit Ruby-Strings Folgendes tun können:

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

Ich möchte dasselbe mit regulären Ausdrücken tun:

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

Offensichtlich funktioniert das nicht wie aufgelistet, ich habe es nur als Beispiel angegeben, um zu zeigen, was ich tun möchte. Ich muss die Übereinstimmung basierend auf dem Wert des Inhalts einer Variablen neu ausdrücken.

cpjolicoeur
quelle

Antworten:

184

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"
Wayne Conrad
quelle
4
Der Hinweis auf Regexp.escape war genau das, von dem ich nicht wusste, dass ich es brauchte. Vielen Dank!
Jeff Paquette
regxPlayerVariable = '(. *?) =. *? document \ .getElementById (# {pluginPlayeVariable})' in diesem habe ich alles oben angewendet, aber diese funktionieren nicht.
SSP
1
@SSP Es könnte gut sein, das Problem in einer separaten Frage zu erklären.
Wayne Conrad
13

Es funktioniert, aber Sie müssen gsub!die Rückgabe verwenden oder einer anderen Variablen zuweisen

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

Ja


str.gsub Regexp.new(var), 'foo'
DigitalRoss
quelle
6

Sie können reguläre Ausdrücke durch Variablen in Ruby verwenden:

var = /Value/
str = "a test Value"
str.gsub( /#{var}/, 'foo' )
GeekTantra
quelle
1
Ich bin mir nicht sicher, warum dies nur negative Stimmen hat. Ich habe es versucht und es funktioniert, obwohl Sie die Regex-Schrägstriche sowohl in der varVariablen als auch im ersten Parameter von gsub nicht benötigen .
Tyler Collier
Ich denke, der Sinn der Schrägstriche in gsub war zu zeigen, dass ein Regex eine Variable enthalten kann, die selbst ein Regex ist. Die Variable muss kein Zeichenfolgentyp sein (und tatsächlich ist Regex aus Gründen, die in Waynes Antwort dargelegt sind, besser).
Mahemoff