Мені потрібно замінити значення рядка моїм регулярним виразом у 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}/