我有以下形式的代码行(构成Ruby哈希):
"some text with spaces" => "some other text",
我编写了以下vim样式正则表达式模式来实现我的目标,即用=>
替换+
左侧字符串中的任何空格:
:%s/\(.*\".*\)\ (.*\"\ =>.*\,)/\1+\2
预期产出:
"some+text+with+spaces" => "some other text",
不幸的是,这只会替换最靠近=>
的空格。是否有另一种模式可以替换一次运行中的所有空间?
答案 0 :(得分:2)
而不是编写一个大型的复杂正则表达式而不是一些较小的正则表达式
:%s/".\{-}"/\=substitute(submatch(0), ' ', '+', 'g')
例如,这将捕获引号中的所有内容(转义引号将其分解),然后用加号替换匹配字符串中的所有空格。
如果您希望它能够使用字符串中的字符串转义引号,则只需将".\{-}"
替换为稍微复杂的正则表达式"\(\\.\|[^\"]\)*"
:%s/"\(\\.\|[^\"]\)*"/\=substitute(submatch(0), ' ', '+', 'g')
如果要限制此替换运行的行,请使用全局命令。
:g/=>/s/"\(\\.\|[^\"]\)*"/\=substitute(submatch(0), ' ', '+', 'g')
所以这只会在=>
的行上运行。
相关帮助主题:h sub-replace-expression
答案 1 :(得分:1)
这远非完美,但几乎完成了这项工作:
:%s/\s\ze[^"]*"\s*=>\s*".*"/+/g
但它不处理转义引号,因此以下行不会被正确替换:
"some \"big text\" with many spaces" => "some other text",