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



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

7 ответов:

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

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

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

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

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

if goo =~ /#{foo}/

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

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

if goo.include?(foo)

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

Regexp.compile(Regexp.escape(foo))

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

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

Используйте Regexp.новое:

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

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

Я обнаружил, что я могу легко вставить в регулярное выражение без использования Regexp.цитата или регулярное выражение.побег, если я просто использовал одинарные кавычки в моей входной строке: (совпадение 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}/

Comments

    Ничего не найдено.