(g)vim替换正则表达式

5

我正在寻找一个正则表达式,可以将类似于这样的内容进行更改:

print "testcode $testvar \n";

printnlog("testcode $testvar \n");

我尝试了 %s/print\s*(.\{-});/printnlog(\1);/g 但是gvim提示

print\s*(.\{-});

不匹配。

我的错误在哪里? 在'\s'后面使用'*'是否可以,因为后面的'{-};'会停止贪婪匹配吗?

提前致谢。


1
+1. 对于在Vim中使用{-}这个命令,我忘记了它。 - MBO
1
发现了一个不错的用于Vim中正则表达式的网站 -> http://vimregex.com 享受它吧 - Milde
4个回答

8

在 vim 中,你需要在括号 () 和竖杠 | 前加上反斜杠,所以请尝试:

:%s/print\s*\(.\{-}\);/printnlog(\1);/g

我简直不敢相信我忘了转义括号 :) 你的正则表达式完美地工作了。 - Milde
谢谢MBO,已删除原始内容并进行了修正! - Adam Neal
1
除非您使用\v,否则您不必转义所有内容 - http://briancarper.net/blog/vim-regexes-are-awesome - Adam Neal
+1 对于 \v,它将来会节省很多反斜杠。 - Milde

4

太好了,我一直在寻找这样的功能。 - Maxim Veksler
我赞同你上面的评论,并给它点了个赞,因为它可以提高可读性并节省时间。 - Milde

0

虽然您可以创建捕获组(就像您正在做的那样),但我认为最简单的方法是使用多个步骤完成工作,使用非常简单的正则表达式和“标志”词。例如:

:%s/print "testcode.*/printnlog(XXX&XXX);/
:%s/XXXprint //
:%s/;XXX//

在这些例子中,我使用“XXX”来表示以后需要修剪的边界(你可以使用任何在你的代码中不出现的内容)。&符号将整个匹配字符串插入到替换字符串中。
我不知道别人怎么想,但是相比于思考捕获组,我更能快速地输入和执行这三个正则表达式。

0

这对你的需求足够吗?

%s/print\s*\("[^"]*"\)/printnlog(\1)

这个正则表达式也可以,但我已经将另一个答案标记为“接受”,不仅因为它是第一个有效的正则表达式,而且它还记得在vim中转义括号 :) - Milde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接