/ / Ruby редовен израз, използвайки променливо име - ruby, regex

Рубинен регулярен израз, използващ името на променливата - рубин, регекс

Възможно ли е да се създаде / използва обикновен шаблон на израз в рубин, който се основава на стойността на име на променлива?

Например, всички знаем, че можем да направим следното с низовете на 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"

Очевидно това не работи както е изброено, аз го поставям само като пример, за да покажа какво бих искал да правя. Трябва да регексирам съвпадение въз основа на стойността на съдържанието на променлива.

Отговори:

152 за отговор № 1

Кодът, който смятате, че не работи, прави:

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

Нещата стават по-интересни, ако var може да съдържамета-символи с редовен израз Ако това стане и искате тези матахарактори да правят това, което обикновено правят в обикновен израз, тогава същият gsub ще работи:

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

Ако обаче вашият низ за търсене съдържа метасимволи и вие го правите не искате те да бъдат интерпретирани като метасимволи, а след това използвайте Regexp.escape така:

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. Не си спомням коя версия въведе промяната).

Както е отбелязано в други отговори, можете да използвате Regexp.new като алтернатива на интерполацията:

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

13 за отговор № 2

Работи, но трябва да използвате gsub! или да присвоите връщането на друга променлива

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

9 за отговор № 3

да


str.gsub Regexp.new(var), "foo"

3 за отговор № 4
str.gsub( Regex.new("#{var}"), "foo" )

2 за отговор № 5

Можете да използвате регулярни изрази чрез променливи в рубин:

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