非常神奇的正则表达式,可以让我替换这些图像吗?

Geo*_*Geo 2 regex vim

我每天都使用vim来处理文本和编写代码。但是,每次我必须执行任何替换或任何形式的正则表达式工作时,都会使我发疯,并且我必须切换到崇高的状态。我想知道,解决这个问题的正确方法是什么:

<img src="whatever.png"/>
<img src="x.png"/>
Run Code Online (Sandbox Code Playgroud)

进入

<img src="<%= image_path("whatever.png") %>"/>
<img src="<%= image_path("x.png") %>"/>
Run Code Online (Sandbox Code Playgroud)

在崇高中,我可以将其用作正则表达式进行搜索:,src="(.*?.png)"并将其用作正则表达式进行替换:src="<%= asset_path("\1") %>"。在vim中,如果这样做::%s/\vsrc="(.*?.png)/src="<%= asset_path("\1") %>"/g我得到:

E62: Nested ?
E476: Invalid command
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Pet*_*ker 5

正如@nhahtdh所说,Vim的正则表达式方言\{-}用作非贪婪量词。如果使用非常神奇的标志,那就是{-}。因此您的命令变成:

:%s/\vsrc="(.{-}.png)/src="<%= asset_path("\1") %>"/g
Run Code Online (Sandbox Code Playgroud)

然而,你也没有逃脱..png这样:

:%s/\vsrc="(.{-}\.png)/src="<%= asset_path("\1") %>"/g
Run Code Online (Sandbox Code Playgroud)

但是我们仍然可以做得更好!通过使用\zs\ze我们可以避免重新键入该src="位。\zs\ze标记将发生替换的比赛的开始和结束。

:%s/\vsrc="\zs(.\{-}\.png)"/<%= image_path("\1") %>"/g
Run Code Online (Sandbox Code Playgroud)

但是,我们仍未完成,因为如果我们仔细选择放置位置\zs\ze然后可以&在替换中使用vim的话,我们可以将它进一步发展。就像\0Perl的regex语法一样。现在我们不需要任何捕获组,这不需要使用非常神奇的标志。

:%s/src="\zs.\{-}\.png\ze"/<%= image_path("&") %>/g
Run Code Online (Sandbox Code Playgroud)

有关更多帮助,请参见以下文档:

:h /\zs
:h /\{-
:h s/\&
Run Code Online (Sandbox Code Playgroud)