在vim中如果我尝试匹配跨行的表达式,从给定的字符串开始到以另一个字符串结束 - 包括第二个字符串 - 我应该怎么做?
例如,在尝试匹配时:
output = double('output').as_null_object
game = Game.new(output)
我已尝试使用/output\_.\{-}output
),但这未能在搜索结果中包含最后一个“输出”。如果我然后使用c/output\_.\{-}output
)更改搜索结果,我会留下一个悬空输出。)
另一个更简单的例子是尝试在文本中找到“January”,包括引号。
我是vim和正则表达式的新手,所以如果这个问题看起来微不足道,请原谅我。我google了一下,找不到答案。
如果你可以命名那个片段,那么ps奖励积分!
答案 0 :(得分:1)
给定一个包含
的文档STUFF
output = double('output').as_null_object
game = Game.new(output)
OTHER STUFF
output = double('output').as_null_object
game = Game.new(output)
CLOSING STUFF
当我:%s/output\_.\{-}output)/<START>\0<MIDDLE>\0<END>/
时,我收到一个包含
STUFF
<START>output = double('output').as_null_object
game = Game.new(output)<MIDDLE>output = double('output').as_null_object
game = Game.new(output)<END>
OTHER STUFF
<START>output = double('output').as_null_object
game = Game.new(output)<MIDDLE>output = double('output').as_null_object
game = Game.new(output)<END>
CLOSING STUFF
但是,如果我把光标放在第一个output
上,那么执行c/output\_.\{-}output)
,
我发现自己处于插入模式,只有output)
被删除。
原因是c/
删除所有直到下一场比赛,它不会删除下一场比赛,正如您所怀疑的那样。 c/
使用正则表达式作为起始位置,而不是持续时间。
在这种情况下,下一场比赛是output)...OTHER STUFF...output=...output)
。
答案 1 :(得分:1)
您的问题可能是默认情况下/regex
动作会将您带到匹配的开始,而您希望它将您带到最后。解决方案是在/e
之后添加regex
:尝试c/output.\{-}output)/e<CR>
,有关详细信息,请参阅:h search-offset
。或者你可以使用\zs
将匹配的开头移动到其他地方:c/output.\{-}output)\zs<CR>
:如果你想匹配中间的某个地方,这会更有用。
答案 2 :(得分:-1)
在单词之间休息时使用_s。所以,/ phrase1_sphrase2