Рубиновое регулярное выражение с использованием имени переменной - PullRequest
93 голосов
/ 15 февраля 2010

Возможно ли создать / использовать шаблон регулярного выражения в 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 ]

167 голосов
/ 15 февраля 2010

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

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 голосов
/ 15 февраля 2010

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

var = "Value"
str = "a test Value"
str.gsub!( /#{var}/, 'foo' )  # Or this: new_str = str.gsub( /#{var}/, 'foo' )
puts str
9 голосов
/ 15 февраля 2010

Да


str.gsub Regexp.new(var), 'foo'
4 голосов
/ 15 февраля 2010

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

var = /Value/
str = "a test Value"
str.gsub( /#{var}/, 'foo' )
3 голосов
/ 15 февраля 2010
str.gsub( Regex.new("#{var}"), 'foo' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...