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.

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"

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


6

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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.