Чи можливо створити / використовувати закономірний вираз у рубіні, який базується на значенні імені змінної?
Наприклад, всі ми знаємо, що ми можемо зробити наступне за допомогою рядків 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" )