Замена частичных совпадений регулярных выражений на Ruby

Я хочу преобразовать следующий текст

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)

Другими словами, я хочу найти все пути к изображениям, заключенные в скобки ( текст в синтаксисе Markdown) и замените их другими путями. Строка, содержащая новый путь, возвращается отдельной функцией real_path .

Я хотел бы сделать это, используя String # gsub в блочной версии. В настоящее время мой код выглядит так:

re = /!\[.*?\]\((.*?)\)/

rel_content = content.gsub(re) do |path|
    real_path(path)
end

Проблема с этим регулярным выражением заключается в том, что оно будет соответствовать ! [Foto] (foto.jpeg) , а не только foto.jpeg . Я также пробовал другие регулярные выражения, такие как (?> \! \ [. *? \] \ () (. *?) (?> \)) , но безрезультатно.

Мой текущий обходной путь - разделить путь и собрать его позже.

Существует ли регулярное выражение Ruby, которое соответствует только пути в скобках, а не всем контекстным обязательным символам?

Обновление после ответов : Основная проблема здесь в том, что в регулярном выражении Ruby нет способа указать ноль- ширина просмотра назад. Наиболее общее решение состоит в том, чтобы сгруппировать часть регулярного выражения до и после действительной части соответствия, то есть / (pre) (matching-part) (post) / , а затем восстановить полную строку.

В этом случае решение будет

re = /(!\[.*?\]\()(.*?)(\))/

rel_content = content.gsub(re) do
    $1 + real_path($2) + $3
end
8
задан gioele 13 December 2011 в 19:29
поделиться