2010-06-04 57 views
7

我在follwing格式文本中的替换空间:VIM的正则表达式的报价

ERR_OUT_OF_MEM, "ERR OUT OF MEM" 
ERR_SOMETHING_BAD, "ERR SOMETHING BAD" 

我要替换文本中哪一个是用下划线引号内的所有空间:

ERR_OUT_OF_MEM, "ERR_OUT_OF_MEM" 
ERR_SOMETHING_BAD, "ERR_SOMETHING_BAD" 

最好正则表达式我能想出是:

\("\w\+\)\@<= 

(有在这后面加上一个空格)

但这只能在每个引用字符串中找到第一个空格,并且我需要多次重复以获得所需的效果。

任何方式一次完成它?

谢谢!

回答

6

当然是有,在一个通工作的一个长度为0的模式,但我从来没有使用它们很成功,我更喜欢这样的做法:

:%s/\%("[^"]*"\)*\("[^"]*"\)/\=substitute(submatch(1), ' ', '_', 'g')/g 

注:双引号保持分组2×2,以不变换

foo bar "foo bar" "foo barr" 

foo bar "foo_bar"_"foo_barr" 

编辑:如风铃草指出ö UT,以下是绰绰有余:

%s/"[^"]*"/\=substitute(submatch(0), ' ', '_', 'g')/g 
+0

为什么不直接使用'/“[^”] *“/'格局我不明白什么跳过最初的双引号购买你(用'\%(“[^”] *“\)*') – rampion 2010-06-04 16:45:48

+0

好点。 我被说服了,搜索将不会在结束报价之后开始,而是在开盘之后。我纠正了正则表达式。谢谢。 – 2010-06-04 17:06:10

6

这不是一个通用的解决方案,因为它会匹配该线路上的双引号后出现在任何地方的任何空间,但应在字符串工作您指定的格式:

s/\v(\".*)@<= /_/g 

我用\ v(verymagic)令牌,因为我认为它使正则表达式有点更具可读性,我包括整个替换命令,因为“G”最后很重要。

对于那些跟在家里的人,这个正则表达式首先用\ v来设置'verymagic'模式。然后它定义了令牌(\".*),它大致意味着“双引号,然后是其他任何内容”,并使用向后注释断言@<=来说“只匹配最后一个标记之后的东西” - 换句话说,只匹配双引号后的某处。最后,还有一个空间,它实际上是匹配的,替换项是下划线,这是我们想要替换它的地方,而g表示“替换所有匹配项”,所以我们不只是得到第一个找到匹配。

+0

这有效,但它也取代了我在行末的空格。 – 2010-06-07 04:45:36

+0

啊。是的,如果你有尾随空格,你需要一个更复杂的方法。上面的Luc应该这样做。 – 2010-06-07 14:07:03

0

我的PatternsOnText plugin提供了:SubstituteInSearch命令。有了它,你的带引号的字符串第一次搜索,然后只在比赛进行:substitute

/".\{-}" 
:SubstituteInSearch/_/ /g