Я хочу преобразовать следующий текст
This is a ![foto](foto.jpeg), here is another ![foto](foto.png)
в
This is a ![foto](/folder1/foto.jpeg), here is another ![foto](/folder2/foto.png)
Другими словами, я хочу найти все пути к изображениям, заключенные в скобки (текст находится вСинтаксис уценки) и заменить их другими путями.Строка, содержащая новый путь, возвращается отдельной функцией real_path
.
Я хотел бы сделать это, используя String#gsub
в его блочной версии.В настоящее время мой код выглядит следующим образом:
re = /!\[.*?\]\((.*?)\)/
rel_content = content.gsub(re) do |path|
real_path(path)
end
Проблема с этим регулярным выражением в том, что он будет соответствовать ![foto](foto.jpeg)
вместо foto.jpeg
.Я также пробовал другие регулярные выражения, такие как (?>\!\[.*?\]\()(.*?)(?>\))
, но безрезультатно.
Мой текущий обходной путь - разделить путь и собрать его позже.
Существует ли регулярное выражение Ruby, которое соответствует только пути внутрискобки, а не все необходимые контекстуальные символы?
Обновление после ответов : Основная проблема здесь заключается в том, что регулярное выражение Руби не имеет возможности задавать точки обзора нулевой ширины.Самое общее решение состоит в том, чтобы сгруппировать часть регулярного выражения до и часть после действительной совпадающей части, то есть /(pre)(matching-part)(post)/
, и затем восстановить полную строку.
В этом случае решение будет
re = /(!\[.*?\]\()(.*?)(\))/
rel_content = content.gsub(re) do
$1 + real_path($2) + $3
end