如何在一行上找到第二和第四个搜索项?

时间:2013-09-28 14:54:14

标签: regex search vim

这是我的文字:

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}

有人可以帮我找到代码中的错误吗?我该如何匹配这个项目?

3 个答案:

答案 0 :(得分:2)

测试此模式时,它仅突出显示第二个匹配,而不是第四个匹配。在正则表达式中交换2和4具有相反的效果。看来下半场被忽略了。

使用text替换后半部分可以达到您的预期效果 - 突出显示my的第二个text和出现次数/^\(.\{-}\zs\(my\)\)\{2}\|\(.\{-}\zsmy\)\{2}。但是,这不是重复使用文本来匹配。

根据vim手册,

  

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

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

我能想到的最好的方法是将第2,第4,第6等匹配与^匹配 - 从下半场开始删除.*$,将4更改为2,这样我们就可以了在我们已经在线的开头使用前半部分匹配之后可以匹配。我无法找到避免匹配第6次和后续匹配的方法 - 如果我们使用\ze来吃剩余的线,我们必须在它前面加\ze以避免其余的线被突出显示,但看起来vim跳回到{{1}}继续寻找匹配的位置。

您想要做的事情可能需要在比赛之间保存太多的上下文和状态。

答案 1 :(得分:0)

如果您要替换,而不仅仅是查找,您可以使用我的PatternsOnText plugin :SubstituteSelected命令,该命令允许指定要替换的实例。在您的示例中,您将单独应用于每一行(使用:global),并指定第2和第4个匹配项:

:%global/^/SubstituteSelected /my/your/g 2,4

答案 2 :(得分:0)

使用此模式:

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