Я хочу преобразовать следующий текст
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