Регулярное выражение 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 ответов:
код, который вы думаете, не работает, делает:
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"