3

这是我的文字:

my text my text my text my text my text
my text my text my text my text my text
        |2|             |4|

在这种情况下,我正在尝试匹配所有行的第 2 项和第 4 项my

我确信下面的代码可以正常工作,无论我如何更改它都不起作用。

/^\(.\{-}\zs\(my\)\)\{2}\|^\(.\{-}\zs\(my\)\)\{4}

有人可以帮我找出代码中的错误吗?我怎样才能匹配这个项目?

4

3 回答 3

2

测试这个模式,它只突出显示第二个匹配,而不是第四个。在正则表达式中交换 2 和 4 会产生相反的效果。下半场似乎被忽略了。

将后半部分替换为text确实做了你认为它会做的事情 - 突出显示第二个my和出现的text. 但是,这不是重用文本来匹配。

根据 vim 手册,

模式是一个或多个分支,用“\|”分隔。它匹配任何与其中一个分支匹配的东西。示例:“foo\|beep”匹配“foo”并匹配“beep”。如果多个分支匹配,则使用第一个。

似乎一旦行的开头与正则表达式匹配,它就被使用并且不可用于进一步匹配。

我能想到的最好的方法是匹配第 2、4、6 等匹配/^\(.\{-}\zs\(my\)\)\{2}\|\(.\{-}\zsmy\)\{2}- 从下半场开始删除^,将 4 更改为 2,这样我们就可以在我们已经使用前半场匹配后进行匹配行的开头。我找不到避免匹配第 6 场和后续比赛的方法 - 如果我们使用.*$吃掉该行的其余部分,我们必须\ze在它之前放一个以避免该行的其余部分被突出显示,但它看起来像 vim 跳转回到\ze原本要继续寻找匹配的地方。

您想要做的可能需要在匹配之间保存太多上下文和状态。

于 2013-09-28T17:03:56.343 回答
0

使用此模式:

\v(.{-}\zs(my)){2}\ze%<33c,这限制了第 33 列之前的搜索。

于 2014-01-13T13:10:04.277 回答
0

如果您要替换,而不仅仅是查找,您可以使用我的PatternsOnText 插件:SubstituteSelected命令,它允许指定要替换的实例。在您的示例中,您将分别将其应用于每一行(使用:global),并指定第二个和第四个匹配项:

:%global/^/SubstituteSelected /my/your/g 2,4
于 2013-09-28T19:14:32.373 回答