2009-12-04 72 views
5

我正在寻找一个正则表达式来改变某些东西。像这样:(g)vim替换正则表达式

print "testcode $testvar \n"; 

printnlog("testcode $testvar \n");

我试图%s/print\s*(.\{-});/printnlog(\1);/g但GVIM说

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

不匹配。

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

在此先感谢。

+1

+1。对于'{ - }',我在Vim中忘记了这个问题 – MBO 2009-12-04 14:30:33

+1

在vim中找到了正则表达式的好网站 - > http://vimregex.com 享受 – Milde 2009-12-04 14:33:59

回答

8

在VIM,你必须在前面加上()|用反斜杠,所以尽量

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

不能相信我忘了跳过括号:)你的正则表达式完美工作罚款 – Milde 2009-12-04 14:28:33

+0

从@ Adam的链接中删除最后一个斜杠上班 – MBO 2009-12-04 14:33:27

+0

感谢MBO,删除了原文,并在下面修复了它! – 2009-12-04 14:39:59

0

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

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

在这些例子中,我使用“XXX”,表示稍后应该被修剪(你可以使用不会出现在你的代码的任何东西)边界。连字符(&)接受整个匹配字符串并将其插入到替换字符串中。

我不知道其他人,但我可以输入并执行这三个正则表达式的速度比我能想象的快得多。

0

这是足以满足您的需求?

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

这个正则表达式还可以,但我已经标记了另一个答案为“接受”,不仅因为它是第一个工作正则表达式,但它记得在vim中跳过括号:) – Milde 2009-12-04 14:44:26

4

MBO的答案的伟大工程,但有时我觉得它更容易使用“非常神奇”选项\v所以我没有逃避一切;使正则表达式更具可读性。

参见:

+0

太好了,我正在搜索为此功能。 – 2009-12-04 14:47:07

+0

上面评论了你的评论,因为我同意,它增加了可读性并为你节省了一些时间 – Milde 2009-12-04 14:51:15