【问题标题】:How to find the 2nd and 4th search item on a line?如何在一行中找到第二个和第四个搜索项?
【发布时间】:2013-10-04 18:46:06
【问题描述】:

这是我的文字:

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}

谁能帮我找出代码中的错误?我该如何匹配这个项目?

【问题讨论】:

  • 4rd 是 3rd 还是 4th 的损坏?
  • 还有,不管是二三还是二四,你两个地方都没有“我的”。
  • @dotNET,我不确定我是否理解你的问题.. 但每行第二个my 和第四个my
  • 你想用这些匹配做什么?突出它们?复制/删除/编辑它们?当您按下n 进行下一场比赛时停止他们?还有什么?
  • @Ben,有时复制,有时,删除它们。我已经有一些功能可以做到这一点,但首先我必须能够突出显示它们。下一个匹配 (n) 必须循环遍历整个文档中的所有匹配。

标签: regex search vim


【解决方案1】:

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

text 替换后半部分确实会如您所想 - 突出显示第二个mytext 的出现。但是,这不是重复使用文本来匹配。

根据vim手册,

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。我有兴趣先找到模式。
    【解决方案3】:

    使用这种模式:

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

    【讨论】:

      猜你喜欢
      • 2015-06-02
      • 2020-04-06
      • 1970-01-01
      • 2017-11-23
      • 2013-05-24
      • 1970-01-01
      • 2016-11-03
      • 2015-04-11
      • 2020-01-13
      相关资源
      最近更新 更多