Espressione regolare Ruby che utilizza il nome della variabile


105

È possibile creare / utilizzare un modello di espressione regolare in ruby ​​basato sul valore di un nome di variabile?

Ad esempio, sappiamo tutti che possiamo fare quanto segue con le stringhe Ruby:

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

Vorrei fare la stessa cosa con le espressioni regolari:

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

Ovviamente non funziona come elencato, l'ho inserito solo come esempio per mostrare cosa mi piacerebbe fare. Ho bisogno di una corrispondenza regexp in base al valore del contenuto di una variabile.

Risposte:


184

Il codice che pensi non funzioni, fa:

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

Le cose diventano più interessanti se var può contenere meta-caratteri di espressioni regolari. Se lo fa e vuoi che quei caratteri mat facciano quello che fanno di solito in un'espressione regolare, allora lo stesso gsub funzionerà:

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

Tuttavia, se la stringa di ricerca contiene metacaratteri e non vuoi che vengano interpretati come metacaratteri, utilizza Regexp.escape in questo modo:

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

Oppure assegna a gsub una stringa invece di un'espressione regolare. In MRI> = 1.8.7, gsub tratterà un argomento di sostituzione di stringa come una stringa semplice, non un'espressione regolare:

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

(In passato un argomento di sostituzione della stringa in gsub veniva convertito automaticamente in un'espressione regolare. So che era così nella versione 1.6. Non ricordo quale versione introdusse la modifica).

Come notato in altre risposte, puoi usare Regexp.new come alternativa all'interpolazione:

var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"

4
Il suggerimento su Regexp.escape era proprio quello di cui non sapevo di aver bisogno. Grazie!
Jeff Paquette

regxPlayerVariable = '(. *?) =. *? document \ .getElementById (# {pluginPlayeVariable})' in questo ho applicato tutto sopra ma non funzionano.
SSP

1
@SSP Potrebbe essere utile spiegare il problema in una domanda separata.
Wayne Conrad,

13

Funziona, ma è necessario utilizzare gsub!o assegnare il ritorno a un'altra variabile

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


6

Puoi usare espressioni regolari tramite variabili in ruby:

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

1
Non sono sicuro del motivo per cui questo ha solo voti negativi. L'ho provato e funziona, anche se non hai bisogno delle barre regex sia nella varvariabile che nel primo parametro di gsub.
Tyler Collier

Penso che il punto delle barre in gsub fosse mostrare che una regex può contenere una variabile che è essa stessa un'espressione regolare. La variabile non deve essere di tipo stringa (e in effetti, regex è migliore per i motivi descritti nella risposta di Wayne).
mahemoff

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.