【发布时间】:2011-12-11 19:56:59
【问题描述】:
我想转换下面的文字
This is a , here is another 
进入
This is a , here is another 
换句话说,我想找到括在括号中的所有图像路径(文本采用 Markdown 语法)并将它们替换为其他路径。包含新路径的字符串由单独的real_path 函数返回。
我想在其块版本中使用String#gsub 来执行此操作。目前我的代码如下所示:
re = /!\[.*?\]\((.*?)\)/
rel_content = content.gsub(re) do |path|
real_path(path)
end
这个正则表达式的问题是它会匹配 而不仅仅是foto.jpeg。我还尝试了其他正则表达式,例如(?>\!\[.*?\]\()(.*?)(?>\)),但无济于事。
我目前的解决方法是拆分路径并稍后重新组装。
是否有一个 Ruby 正则表达式只匹配括号内的路径而不匹配所有上下文所需的字符?
答案后更新:这里的主要问题是 Ruby 的正则表达式无法指定零宽度的后视。最通用的解决方案是将正则表达式之前的部分和真正匹配部分之后的部分分组,即/(pre)(matching-part)(post)/,然后重构完整的字符串。
在这种情况下,解决方案是
re = /(!\[.*?\]\()(.*?)(\))/
rel_content = content.gsub(re) do
$1 + real_path($2) + $3
end
【问题讨论】:
标签: ruby regex markdown replace