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

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

96
задан cpjolicoeur 15 February 2010 в 19:34
поделиться

5 ответов

Код, который, по вашему мнению, не работает , делает:

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"
173
ответ дан 24 November 2019 в 05:36
поделиться

Да


str.gsub Regexp.new(var), 'foo'
9
ответ дан 24 November 2019 в 05:36
поделиться

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

var = "Value"
str = "a test Value"
str.gsub!( /#{var}/, 'foo' )  # Or this: new_str = str.gsub( /#{var}/, 'foo' )
puts str
13
ответ дан 24 November 2019 в 05:36
поделиться

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

var = /Value/
str = "a test Value"
str.gsub( /#{var}/, 'foo' )
4
ответ дан 24 November 2019 в 05:36
поделиться
str.gsub( Regex.new("#{var}"), 'foo' )
3
ответ дан 24 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: