/ / Рубічний регулярний вираз, використовуючи назву змінної - ruby, regex

Регулярний вираз 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"

Речі стають цікавішими, якщо вар може міститимета-символи регулярного вираження. Якщо це так, і ви хочете, щоб ті матахарактори виконували те, що вони зазвичай роблять, у звичайному виразі, тоді той самий 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" )