Регулярное выражение Ruby с использованием имени переменной


можно ли создать/использовать шаблон регулярного выражения на Ruby, который основан на значении имени переменной?

например, мы все знаем, что мы можем сделать следующее с рубиновыми строками:

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

Я хотел бы сделать то же самое с регулярными выражениями:

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

очевидно, что это не работает, как указано, я только поставил его там в качестве примера, чтобы показать, что я хотел бы сделать. Мне нужно регулярное выражение соответствия на основе значения переменной содержание.

5 87

5 ответов:

код, который вы думаете, не работает, делает:

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

все становится более интересным, если var может содержать мета-символы регулярного выражения. Если это так, и вы хотите, чтобы эти matacharacters делали то, что они обычно делают в регулярном выражении, то тот же gsub будет работать:

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

однако, если строка поиска содержит метасимволы и вы не хотите, чтобы они интерпретировались как метасимволы, а затем используйте регулярное выражение.побег, как это:

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

или просто дать gsub строку вместо регулярного выражения. В MRI >= 1.8.7 gsub будет рассматривать аргумент замены строки как простую строку, а не регулярное выражение:

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

(раньше аргумент замены строки в gsub автоматически преобразовывался в регулярное выражение. Я знаю, что это было в 1.6. Я не помню, какая версия внесла изменения).

как отмечалось в других ответах, вы можете использовать регулярное выражение.Новый как альтернатива интерполяции:

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

это работает, но вы должны использовать gsub! или назначить возврат к другой переменной

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

да


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

вы можете использовать регулярные выражения через переменные в Ruby:

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