2013-08-15 1 views
2

У меня есть массив различных URL-адресов изображений, где мне нужно заменить «/ s_» на «/ xl_». Ive пробовал несколько разных способов, но не из них, похоже, работает так, как я их ожидаю. Вот моя последняя версия:Частичная строка заменить на gsub

available_images.each do |img| 
    img.gsub(/.*(\/s_).*\.jpg/, "\/xl_") 
end 

available_images является массив, содержащий несколько строк (которые, конечно, соответствовать указанному регулярному выражению:. * (/ S _) * JPG..). Любые мысли о том, как это можно исправить?

Заранее благодарен!

ответ

1

gsub! (! потому, что вы делаете each и не map) с простой строки (вместо регулярных выражений) должно работать:

"path/to/s_image.jpg".gsub '/s_', '/xl_' 
# => "path/to/xl_image.jpg" 

Update

Как было отмечено в комментариев, решение может привести к неожиданному поведению, если путь содержит несколько вхождений '/s_'.

"path/s_thing/s_image.jpg".gsub '/s_', '/xl_' 
#=> "path/xl_thing/xl_image.jpg" 
      ▲  ▲ 

Borodin опубликовал хорошую, короткую замену регулярных выражений, который работает в этом случае:

"path/s_thing/s_image.jpg".sub %r|/s_(?!.*/)|, '/xl_' 
#=> "path/s_thing/xl_image.jpg" 
      △  ▲ 

Это только заменяет последнее вхождение '/s_'.

+0

Спасибо за подсказку. Работает отлично! – Severin

+0

Вероятно, 'sub' более подходит – Borodin

+0

' sub', вероятно, так же плохо, как 'gsub'. В случае множественных вхождений строки '/ s_' обе могут привести к неожиданному bahavior. Может быть, 'sub! /(.*)(?:\/s_)(.*\.jpg)/, "# {$ 1}/xl _ # {$ 2}" 'лучше (но сложнее) – tessi