Мне нужно подставить значение строки в мое регулярное выражение в Ruby. Есть простой способ сделать это? Например:
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
if goo =~ /value of foo here dynamically/
puts "success!"
end
Мне нужно подставить значение строки в мое регулярное выражение в Ruby. Есть простой способ сделать это? Например:
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
if goo =~ /value of foo here dynamically/
puts "success!"
end
Ответы:
То же, что и вставка строки.
if goo =~ /#{Regexp.quote(foo)}/
#...
Обратите внимание , что Regexp.quote
в ответ Джон Лоэнгрина важно!
if goo =~ /#{Regexp.quote(foo)}/
Если вы просто делаете «очевидную» версию:
if goo =~ /#{foo}/
тогда точки в вашем тексте совпадения рассматриваются как подстановочные знаки регулярного выражения и "0.0.0.0"
будут совпадать "0a0b0c0"
.
Также обратите внимание, что если вы действительно хотите проверить соответствие подстроки, вы можете просто сделать
if goo.include?(foo)
который не требует дополнительного цитирования или беспокойства о специальных символах.
.quote()
) также может быть полезно, если вы хотите построить регулярное выражение, используя строку.
if goo.include?(foo)
» => True, если вы заинтересованы в проверке существования. Если вы заинтересованы в замене и уже используете String.gsub, то Regexp.quote может быть вашим единственным вариантом.
Regexp.new
или Regexp.compile
.
Regexp.compile(Regexp.escape(foo))
Используйте Regexp.new:
if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/
Вот ограниченный, но полезный другой ответ:
Я обнаружил, что могу легко вставить в регулярное выражение, не используя Regexp.quote или Regexp.escape, если я просто использовал одинарные кавычки в моей входной строке: (соответствие IP-адреса)
IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key
# replace the ip, for demonstration
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0")
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4"
одиночные кавычки интерпретируют только \\ и \ '.
http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes
Это помогло мне, когда мне нужно было использовать одну и ту же длинную часть регулярного выражения несколько раз. Не универсальный, но подходит под вопрос вопроса, я считаю.
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
puts "success!" if goo =~ /#{foo}/