在vim中如何进行正则表达式匹配?

时间:2011-05-04 22:09:30

标签: regex vim

在vim中如果我尝试匹配跨行的表达式,从给定的字符串开始到以另一个字符串结束 - 包括第二个字符串 - 我应该怎么做?

例如,在尝试匹配时:

output = double('output').as_null_object
game = Game.new(output)

我已尝试使用/output\_.\{-}output),但这未能在搜索结果中包含最后一个“输出”。如果我然后使用c/output\_.\{-}output)更改搜索结果,我会留下一个悬空输出。)

另一个更简单的例子是尝试在文本中找到“January”,包括引号。

我是vim和正则表达式的新手,所以如果这个问题看起来微不足道,请原谅我。我google了一下,找不到答案。

如果你可以命名那个片段,那么

ps奖励积分!

3 个答案:

答案 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