在PhpStorm
中,要查找指定的字符串,我们可以使用Ctrl + F
这个快捷键。要查找并替换字符串,我们可以使用Ctrl + R
这个快捷键。
然而有时候,我们需要查找并替换一系列字符串中的特定部分,这样手动操作就显得很乏力了。举个例子来说,假设我们有一个模板文件,其中有500
个的<img src="img/image-n.jpg">
图片标签,其中每一个标签里的image-n
都不一样。那么如果我们想将src
中的字符串全部替换成{{ asset("images/image-n.jpg") }}
,现在你可以在脑海里思考一下,如果手动操作这500
标签的容易程度。
我们的目标是将每一个img
标签中的image-n.jpg
这个部分抽取出来,然后在构建新的src
字符串时,将抽取出来的字符串添加到{{ asset("images/") }}
之中。
那么首先我们需要在Ctrl + R
查找并替换字符串的时候,使用Regex
,即我们需要勾选右侧的Regex
选项。
接着我们需要构建出只选择我们需要的"img/image-n.jpg"
这部分的正则表达式:
"img/(.*?)"
好奇.*
后面的?
是什么意思吗?这个?
非常重要,因为它表示我们以non-greedy
的方式来查找字符串,即它将匹配最少的字符串。我们对比一下使用了?
和没有使用?
的区别:
可以看到,未使用?
的话,我们的正则表达式将匹配到alt=""
,因为alt=
也会被.*
所匹配。
使用?
的话,我们可以发现,表达式将正好匹配我们需要的字符串:
好了,现在我们匹配到了我们需要的字符串,我们需要怎么样进行替换呢?
细心的你一定注意到了我们在.*?
之外加上了小括号(()
)。与php
中正则匹配规则一致,我们将img/
后的字符串放入了一个group
中,这样我们在替换的时候可以使用$1
来指代这个group
中的内容:
是不是很神奇呢?要替换所有500
个字符串,我们只需要点击REPLACE ALL
就可以了,一键搞定,完美!