如何使用gsub在Ruby中提取和替换?

时间:2014-03-18 18:07:08

标签: ruby regex markdown gsub

我在几个文件中有一堆markdown图像路径,我想更改根目录。图像标记的正则表达式是:

/\!\[image\]\((.*?)\)/

我需要能够抓取该组,解析出文件名并给它一个新路径,然后再将其返回gsub进行替换。

例如,我想找到这样的所有字符串:

![image](/old/path/to/image1.png)

并将它们转换为:

![image](/new/path/to/image1.png)

我知道我可以在gsub块中执行此操作,但我不太清楚它是如何工作的。

2 个答案:

答案 0 :(得分:2)

这是一种方式,为了清晰起见,详细说明:

markdown = "![image](/old/path/to/image1.png)"
regex = /(\w+.png)/
match_data = regex.match markdown

p base_name = match_data[1]
#=> "image1.png"

p new_markdown = "![image](/new/path/to/#{base_name})"
#=> "![image](/new/path/to/image1.png)"

更简洁:

p markdown.gsub( /\/.+(\w+.png)/, "/new/path/to/#{$1}" )
#=> "![image](/new/path/to/image1.png)"

答案 1 :(得分:0)

您可以使用具有正向lookbehind和正向前瞻的正则表达式来仅替换原始String中的文件名部分。我有一个new_path变量保存新路径,只需使用.sub替换它。

img = "![image](/old/path/to/image1.png)"
new_path = '/new/path/to/image1.png'
p img.sub(/(?<=!\[image\]\()[^)]+(?=\))/, new_path)
# => "![image](/new/path/to/image1.png)"