Интерполяция строки в регулярное выражение

127

Мне нужно подставить значение строки в мое регулярное выражение в 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
  • 0
    Вы пытаетесь увидеть, является ли foo подстрокой goo? Я не думаю, что понятно, о чем ты спрашиваешь.
  • 0
    Если так, то goo.include? (Foo) достаточно!
Показать ещё 1 комментарий
Теги:

7 ответов

221
Лучший ответ

То же, что и вставка строки.

if goo =~ /#{Regexp.quote(foo)}/
#...
  • 13
    Вау, код Ruby обладает внутренней красотой.
94

Обратите внимание, что Regexp.quote в ответе Джона Л. важен!

if goo =~ /#{Regexp.quote(foo)}/

Если вы просто делаете "очевидную" версию:

if goo =~ /#{foo}/

то периоды в тексте соответствия рассматриваются как подстановочные знаки регулярного выражения, а "0.0.0.0" будет соответствовать "0a0b0c0".

Также обратите внимание, что если вы действительно хотите проверить соответствие подстроки, вы можете просто сделать

if goo.include?(foo)

который не требует дополнительного цитирования или беспокойства о специальных символах.

  • 0
    Ах, здорово поймать Гленна! Спасибо!
  • 3
    Обратите внимание, что обратное (без использования .quote() ) также может быть полезно, если вы хотите создать регулярное выражение, используя строку.
Показать ещё 3 комментария
6

Вероятно, Regexp.escape(foo) будет отправной точкой, но есть веская причина, по которой вы не можете использовать более обычную экспрессию-интерполяцию: "my stuff #{mysubstitutionvariable}"?

Кроме того, вы можете просто использовать !goo.match(foo).nil? с литеральной строкой.

6
Regexp.compile(Regexp.escape(foo))
3

Использовать Regexp.new:

if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/
2

Здесь ограниченный, но полезный другой ответ:

Я обнаружил, что я могу легко вставить в регулярное выражение без использования 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

Это помогло мне, когда мне нужно было использовать одну и ту же длинную часть регулярного выражения несколько раз. Я не верю, что не универсален, но подходит для примера.

  • 0
    Мне любопытно, что подумают о моем посте здесь, но я сомневаюсь, что это будет видно здесь и сейчас.
  • 0
    комментарии гораздо более полезны, чем отрицательный ответ.
-1
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 

puts "success!" if goo =~ /#{foo}/
  • 2
    Нет, это даст ошибочное «истину», поскольку «здесь есть еще что-то 070x0! 0», потому что точки являются регулярными символами регулярного выражения.
  • 0
    хороший улов Гленн.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню