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
。我也試過其他regexen像(?>\!\[.*?\]\()(.*?)(?>\))
但無濟於事。
我目前的解決方法是拆分路徑並稍後重新組裝。
是否有一個Ruby正則表達式只匹配括號內的路徑,而不是所有需要上下文的字符?
Post-answers update:這裏的主要問題是Ruby的regexen沒有辦法指定零寬度lookbehinds。最通用的解決方案是將以前的正則表達式的部分和真正的匹配部分(即/(pre)(matching-part)(post)/
)之後的部分進行分組,然後重建完整的字符串。
在這種情況下的解決方案將是
re = /(!\[.*?\]\()(.*?)(\))/
rel_content = content.gsub(re) do
$1 + real_path($2) + $3
end
也許最好的辦法是,正如你提到的,重建的字符串之前和在不同羣體的實際比賽結束後,保存部分更具可讀性並用'$ 1 + real_path($ 2)+ $ 3'重新構造最終的字符串。 – gioele