2014-08-27 67 views
0

我的代码行(构成一个Ruby的哈希值)与形式:避免重蹈正则表达式替换

"some text with spaces" => "some other text", 

我写了下面的vim风格的正则表达式来实现我的目标,这是代替空格在字符串到=>左侧与+

:%s/\(.*\".*\)\ (.*\"\ =>.*\,)/\1+\2 

预期输出:

"some+text+with+spaces" => "some other text", 

不幸的是,这只会取代最靠近=>的空间。是否有另一种模式可以替代一次运行中的所有空间?

+0

作为输出您期待什么? (另外,这个替换对我来说没有任何作用) – FDinoff 2014-08-27 22:46:03

+0

重申,这是在Vim中。期望的效果是在上述所有行中替换'=>'左边的所有空格,给出: '“some + text + with + spaces”=>“其他文本:' – 2014-08-28 00:51:30

+0

你可以把(这是我真正想问的) – FDinoff 2014-08-28 00:53:57

回答

1

这是完美甚远,但它几乎工作:

:%s/\s\ze[^"]*"\s*=>\s*".*"/+/g 

但它不处理转义引号,所以下面一行将不能正确替换:

"some \"big text\" with many spaces" => "some other text", 
+0

这真棒!我没有任何转义引号,所以它的工作原理。我希望我用这个而不是重复我的查询直到我想改变的所有空间都被改变。 – 2014-08-28 00:58:46

2

而不是写一个大型复杂的正则表达式几个规模较小的会更容易

:%s/".\{-}"/\=substitute(submatch(0), ' ', '+', 'g') 

对于instan这将捕捉引号中的所有内容(转义引号将其分开),然后用加号替换匹配字符串中的所有空格。

如果你希望它处理字符串转义引号,你只需要一个稍微复杂的正则表达式来替换".\{-}"字符串中"\(\\.\|[^\"]\)*"

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

如果你想限制线路上使用这种替代运行全球指挥。

:g/=>/s/"\(\\.\|[^\"]\)*"/\=substitute(submatch(0), ' ', '+', 'g') 

因此,这将只适用于=>行。

相关帮助主题:h sub-replace-expression