Мені потрібно замінити значення рядка моїм регулярним виразом у 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)" => Істинно, коли вам цікаво перевірити наявність. Якщо ви зацікавлені в заміні і вже використовуєте String.gsub, то Regexp.quote може бути вашим єдиним варіантом.
Regexp.newабо Regexp.compile.
Ймовірно, Regexp.escape(foo)це буде відправною точкою, але чи є вагомі причини, що ви не можете використовувати більш звичайний вираз-інтерполяцію:"my stuff #{mysubstitutionvariable}" :?
Крім того, ви можете просто використовувати !goo.match(foo).nil?з буквальним рядком.
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}/